2016-04-23 5 views
2

私はプロローグでユニバーサルファクトを見つける方法プロローグで

child(martha,charlotte). 
child(charlotte,caroline). 
child(caroline,laura). 
child(laura,rose). 

descend(X,Y) :- 
    child(X,Y). 
descend(X,Y) :- 
    child(X,Z), 
    descend(Z,Y). 

を書き込み、

?- findall(X,descend(martha,X),Z). 

を書いてもらうことができます4つのソリューション

Z = [charlotte,caroline,laura,rose] 

しかし、私はその後、普遍的な事実を追加する場合

likes(X,pomegranate). 

と私が得る

?- findall(X,likes(X, pomegranate),Z). 

を試してみてください。

Z = [_G17]. 

_G17ことは何ですか? 基本的にすべての変数を取得するためには、変更する必要があるのは何ですか? (likes(X,pomegranate)以来はすべてが右...ザクロが好き意味すべき?):

Z = [martha,charlotte,caroline,laura,rose] 
+0

ところで、これは宿題ではありませんが、これは私が趣味としてPrologを再学習しようとしていることです – Luxspes

答えて

3

2つの溶液。

person(martha). 
person(charlotte). 
% etc 

そして、あなたではなくなり、「好き」:

person_likes(P, pomegranate) :- 
    person(P). 

あなたはまた、ハッキングしようとすることができるきれいな解決策は、あなたが記述宇宙にすべての「もの」を示していますテーブルを持つことですその周辺:

person(P) :- child(P, _). 
person(P) :- child(_, P). 

これは...不満ですか?リレーショナルデータベースについて考えてみよう:あなたは二つのテーブルだろう:私の知る限り、あなたがプロローグでまったく同じことをしない理由を、知っていますように、

CREATE TABLE person (
    id INTEGER PRIMARY KEY, -- usually autogenerated 
    name TEXT NOT NULL 
); 
CREATE TABLE parent_child (
    parent_id INTEGER NOT NULL, 
    child_id INTEGER NOT NULL, 
    FOREIGN KEY parent_id REFERENCES person(id), 
    FOREIGN KEY child_id REFERENCES person(id) 
); 

唯一の理由を、ほとんどの入門チュートリアルをしようとしているということですあなたを誘惑し、そのような詳細に踏み込むことは避けてください。もちろん、Prologの "データベース"は真のリレーショナルデータベースではありません(例えば、引数の位置は重要です)。

TL; DR Prologを使用しているときにPrologの解像度戦略について考えることは避けられません。