2017-05-05 9 views
3

私はProlog(swi-prolog)で私の最初のステップを実行しており、次の問題を解決することはできません。具体的には、「誰もが誰かの友である」という文章をどのように含めることができますか\forall x \exists y friend(x,y)?これまでに私が見つけたすべての質問は、事実ではなく質問に関するものでした。ありがとうございました!Prologの事実における存在量の定量化

答えて

5

あなたが与えた例では、実際にはルールではなく変数を定量化しています。あなたがそのような論理式としてルールを記述することができるように、ルール内の変数は普遍的、定量化されている

friend_of(a,b). 

friend(X) :- 
    friend_of(X,Y). 

XY(friend(X)friend_of(X,Y))これを念頭に置いて、次の例を考えてみ

変数Yはルールの先頭には存在しないため、その汎用的な量指定子を存在のqとして規則の本体に移動できますuantifier:friend_of(X,Y)真であるYように存在する場合も同様であるXfriend(X) FORALL:

X(friend(X) ← ∃ Yfriend_of(X,Y))

は今、この式はとして読み出します。これはあなたが望むものにかなり近いようです。

一方、事実を考慮すると、事実が何かを示すために使用されます。上記の例では/ 2 friend_of実際には変数がここに存在しない、しかし

friend_of(a,b) :- true. 

を書くだけの短い方法ですので、オーバー定量化するものは何もありません。

編集:あなたのコメントの場合については、述語は関係を構成することに注意してください。関係は必然的に対称的ではなく、それがfriend_of/2の関係に名前を付けた理由です。すなわち、friend_of(a,b)は、必ずしもfriend_of(b,a)を意味するものではありません。関係は必然的に反射的でもありません。友人関係が再帰的かどうかは議論の余地がある。しかし、それは確かに可能な読書です。このことを念頭に置いて、あなたのコメントで挙げた例では、あなたはそのようないくつかのaを説明し、事実、人物などbcを、持っていると仮定してみましょう:

person(a). 
person(b). 
person(c). 

次にあなたが反射関係の友人/ 2などを記述することができますso:

friends(a,b) :- false. % example from your comment 
friends(a,c) :- false. % example from your comment 
friends(X,X) :-   % the relation is reflexive 
    person(X).   % among people 

反射性を表現するルールは、基本的に誰もが少なくとも彼/彼女自身と友人であると述べています。この規則からあなたの必要条件誰もが誰かの友人ですの直後です。

?- friends(a,X). 
X = a 

二つの異なる人々の間には、実際の友情が述べられていませんが、最も一般的なクエリはまた、すべての人のための結果が得られます:

?- friends(X,Y). 
X = Y = a ? ; 
X = Y = b ? ; 
X = Y = c 

注意することをあなたがこの関係を照会する場合は、望ましい結果を得ます実際の人に答えを制限するには、fact/person/1が必要です。あなたは友人を照会する場合/いくつかの非人と2:あなたは、このような目標を持たずに反射性を定義しようとした場合

?- friends(cos(0),X). 
no 

friend(X,X). 

あなたの定義があまりにも一般的になります。

?- friends(a,X).   % desired result 
X = a 
    ?- friends(cos(0),X).  % undesired result 
X = cos(0) 

最も一般的なクエリは実際の人物を生成しません:

+0

あなたは正しいですが、私は少し専門用語を混ぜます。私はこの演習の目的はいくつかの事実を考慮して友情を推測することだと思います。例えば。私が知っているのは、a、b、cと〜の友人(a、b)と〜friend(a、c)です。私はまだそれがあなたの提案された解決策でうまくいくかどうかはまだ分かりません。 – huxley

+0

@huxley: "〜friend(a、b)"とはどういう意味ですか?事実 'friend(a、b)'を与えたということですか?または、「a」と「b」は友人ではないことを明示しています。たとえば、「friend(a、b):false」です。 – tas

+0

2番目のケースは私の意図です。だから、aとbとaとcが友達ではないことを考えれば、どのようにしてaとaはあなたの解を「誰もの友人ですか?」と与えられた友人(友人(a、a))でなければなりません。 – huxley

関連する問題