1


0

プロローグステートメントのHEADでAnd句を使用する

このクラブのすべての会員は、教育を受けているか、金持ちか、その両方です。

PROLOGコードに上記と非常によく似たステートメントを書きたいと思いました。 私は他のすべてを書きました。

edu(X);rich(X) :- member(X).

これは私が書いたものです。 ただし、PROLOGでは、head句の演算子はすべて許可されます。 私はこれまで5時間を費やしてこの声明でさまざまなことを試みましたが、解決策に到達することができませんでした。 :(

4 回答


2


Prologが基づいているロジックの形式の説明については、http://en.wikipedia.org/wiki/Horn_clauseを参照してください。

あなたの声明(「このクラブのすべてのメンバーは教育を受けているか、金持ち、またはその両方です」)を与えられて、あなたが真実であると宣言できる唯一のものは:

  • 人は金持ちではなく会員であれば教育を受けます。

  • 人は教育を受けていないメンバーである場合、金持ちです。

たとえば、次のことは必ずしも当てはまりません。

  • 金持ちで教育を受けた人がメンバーです。

  • 金持ちのメンバーは教育を受けています。

  • 金持ちのメンバーは教育を受けていません。


1


複数のヘッドを組み合わせることはできません。 `member(X)`がtrueのときに `edu(X)`と `rich(X)`をtrueにしたい場合、それらを別々に定義する必要があります(「このクラブのすべてのメンバーは教育を受けます」、「このクラブは金持ちです」):

edu(X) :-
   member(X).
rich(X) :-
   member(X).

トリッキーな部分は、元のステートメントが整形式ではないということです。 それは、一部のメンバーは金持ちであるが、教育を受けていない、またはその逆かもしれないと言います。 これは問題があります。 たとえば、メンバーが裕福でない場合は教育を受け、その逆も同様であるという素朴なケースを考えてみましょう。

edu(X) :-
    member(X), \+ rich(X).
rich(X) :-
    member(X), \+ edu(X).

現在、これらのルールに従って、誰も自動的に豊かな教育を受けません。 すべてのメンバーを2つのうちの少なくとも1つとして定義する限り、これは問題ありません。 ただし、次の事実を考慮してください。

member(alice).
member(bob).
member(charlie).
member(dave).

rich(alice).
edu(bob).
rich(charlie).
edu(charlie).

この場合、 `rich(alice)`は事実であるため正常に動作します。 「edu(alice)」は「no」になります。 ボブの場合は逆です。 チャーリーでは、両方を事実として定義したため、両方とも真実です。 しかし、デイブはどうですか? `edu(dave)`と `rich(dave)`は両方とも他方を参照し、無限の再帰を作成します。 あなたが何をしているかについてのさらなる知識がなければ、これを解決するためにできる最善の方法は、 `edu(X)`または `rich(X)`のいずれかをtrueにデフォルト設定することです:

edu(X) :-
    member(X).
rich(X) :-
    member(X), \+ edu(X).

明示的に宣言しない限り、誰もが教育を受けていると見なされます。 必要に応じて、デフォルトでリッチに設定することもできます。 追加情報が不足しているため、これが最善です。


1


サイドノートとして:節の頭で分離を使用するというアイデアは、_分離論理プログラミングにつながりました。たとえば、Arcot Rajaseka、Jack Minker、Jorge Loboによる「分離論理プログラミングの基礎」を参照してください。 `edu(X); rich(X):-member(X).`は有効な選言句です。 関連トピックである選言データログは、DLVプロジェクトのNicola Leone、Gerald Pfeifer、Wolfgang Faberによって調査されました。http://www.dbai.tuwien.ac.at/proj/dlv/


-1


たぶんあなたは書きたい:

member(X) :- edu(X) ; rich(X)

誰かが教育を受けている場合、金持ち、またはその両方がクラブの会員です。