2016-04-23 6 views
2

In Prolog kann ichWie finden Sie alle universellen Fakten in Prolog?

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). 

schreiben und dann

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

schreiben und vier Lösungen

Z = [charlotte,caroline,laura,rose] 

bekommen, aber wenn ich eine universelle Tatsache, fügen Sie dann

likes(X,pomegranate). 

und

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

Ich versuche zu bekommen:

Z = [_G17]. 

Was ist das _G17? Was muss ich ändern, um im Wesentlichen alle Variablen zu erhalten? (seit likes(X,pomegranate) sollte bedeuten, alles Granatapfel mag ... richtig?):

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

Übrigens, das sind keine Hausaufgaben, das versuche ich, Prolog als Hobby neu zu lernen – Luxspes

Antwort

3

Zwei Lösungen. Die saubere Lösung ist eine Tabelle, die alle „Dinge“ im Universum aufgeführt, die Sie beschreiben:

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

Sie können auch versuchen zu hacken:

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

und dann „likes“ eher würde drum herum:

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

Aber das ist ... unbefriedigend? Denken Sie an eine relationale Datenbank: Sie zwei Tabellen haben würde:

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) 
); 

Der einzige Grund, soweit ich weiß, warum Sie genau die gleiche Sache in Prolog nicht tun, ist, dass die meisten Einführungen versuchen um dich zu verführen und zu vermeiden, in solche Details zu gehen. Und natürlich ist die Prolog "Datenbank" keine echte relationale Datenbank (zum Beispiel spielt die Argumentposition eine Rolle!).

TL; DR Sie können nicht umhin, über Prologs Auflösungsstrategie nachzudenken, wenn Sie Prolog verwenden.

Verwandte Themen