Die folgende Geschichte stammt aus N. Wirths (1976) Algorithmen + Datenstrukturen = Programme.Wie kann ich in Prolog "Ich bin mein eigener Opa" umsetzen?
heiratete ich eine Witwe (lassen Sie uns ihre W nennen) , der eine Tochter grown-up hatte (nennen wir sie D). Mein Vater (F), der uns oft besuchte , verliebte sich in meine Stieftochter und heiratete sie. Also, mein Vater wurde mein Schwiegersohn und meine Stieftochter wurde meine Mutter. Einige Monate später gebar meine Frau einen Sohn (S1), der der Schwager meines Vaters, sowie als mein Onkel wird. Diese Frau meines Vaters, das heißt, meine Stieftochter, hatte auch einen Sohn (S2).
Ich bin versucht, diese Beziehungen in Prolog zu modellieren, um schließlich werde ich in der Lage sein, zu geben:
| ?- grandfather(i,i).
Und ich werde ein „Ja“ oder „Nein“ zu geben ob ich mein eigener Opa bin oder nicht.
Hier ist der Code, den ich bisher geschrieben habe (grandpa.pl):
aunt(X,Y):-
sibling(X,Z),
parent(Z,Y),
female(X).
brother(X,Y):-
sibling(X,Y),
male(X).
brother_in_law(X,Y):-
child(X,Z),
married(Z,W),
parent(W,Y),
not(sibling(X,Y)),
male(X).
brother_in_law(s1,f).
child(X,Y):-
parent(Y,X).
daughter(X,Y):-
parent(Y,X),
child(X,Y),
female(X).
daughter(d,w).
father(X,Y):-
parent(X,Y),
male(X).
father(f,i).
father_in_law(X,Y):-
child(X,Z),
married(Y,Z),
not(child(X,Y)),
male(X).
grandparent(X,Y):-
parent(X,Z),
parent(Z,Y).
grandmother(X,Y):-
grandparent(X,Y),
female(X).
grandfather(X,Y):-
grandparent(X,Y),
male(X).
grandchild(X,Y):-
child(X,Z),
child(Z,Y).
married(X,Y):-
wife(X,Y),
female(X).
married(X,Y):-
husband(X,Y),
male(X).
married(i,w).
married(f,d).
mother(X,Y):-
parent(X,Y),
female(X).
parent(X,Y):-
child(Y,X).
sibling(X,Y):-
parent(Z,X),
parent(Z,Y).
sister(X,Y):-
sibling(X,Y),
female(X).
son(X,Y):-
parent(Y,X),
male(X).
son(s1,w).
son(s2,d).
son_in_law(X,Y):-
child(X,Z),
not(child(X,Y)),
married(Z,Y),
male(X).
son_in_law(f,i).
step_daughter(X,Y):-
child(X,Z),
married(Z,Y),
not(child(X,Y)),
female(X).
step_daughter(d,i).
step_parent(X,Y):-
married(X,Z),
parent(Z,Y),
not(parent(X,Y)).
step_father(X,Y):-
step_parent(X,Y),
male(X).
step_mother(X,Y):-
step_parent(X,Y),
female(X).
step_mother(d,i).
uncle(X,Y):-
sibling(X,Z),
parent(Z,Y),
male(X).
uncle(s1,i).
Gerade jetzt eine Menge Ärger mit Kreis Definitionen Ich habe, so dass ich in Endlosschleifen erhalten, wenn die Abfrage ausgeführt werden : Großvater (ich, ich).
Zum Beispiel habe ich:
(1 ms) ja {trace} | ? - Großvater (ich, ich). 1 1 Anruf: Großvater (ich, ich)?
2 2 Anruf: Großeltern (i, i)?
3 3 Anruf: Eltern (i, _103)?
4 4 Anruf: Kind (_127, i)?
5 5 Anruf: Eltern (i, _151)?
6 6 Anruf: Kind (_175, i)?
7 7 Anruf: Eltern (i, _199)?
8 8 Anruf: Kind (_223, i)?
9 9 Anruf: Eltern (i, _247)?
10 10 Anruf: Kind (_271, i)?
11 11 Anruf: Eltern (i, _295)?
12 12 Anruf: Kind (_319, i)?
13 13 Anruf: Eltern (i, _343)?
14 14 Anruf: Kind (_367, i)?
15 15 Anruf: Eltern (i, _391)? Diese
...
ist, weil Kind definiert sich wie ein Elternteil hat, und Eltern definiert sich ein Kind hat, die (wie in den oben genannten Prädikate sehen werde ich geschrieben).
Kann mir jemand helfen, meine Prädikate für diese Beziehungen neu zu definieren, damit ich feststellen kann, ob ich mein eigener Opa bin?
Heh, ich hatte eigentlich, dass für meine AI-Klasse zu tun. Ich frage mich, ob ich noch den Code habe ... Ich werde nachsehen, wenn ich nach Hause komme. Ich erinnere mich, dass es auch mein Gehirn schmerzte. –
Sie verwenden Prolog in West Virgina? ;-) –
@ T.E.D .: Shh! Der TXI wird dich hören! –