Następująca historia pochodzi z N. Wirtha (1976) Algorytmy + Datastructures = Programy.Jak mogę zaimplementować: "Jestem moim własnym dziadkiem" w Prologu?
I poślubił wdowę (nazwijmy ją biała) która miała dorosłą córkę (nazywają ją D). Mój ojciec (F), który odwiedzał nas dość często, zakochał się w mojej krokodynce i ożenił się z nią. Stąd mój ojciec stał się moim zięciem, a moja córka stała się moją matką. Kilka miesięcy później moja żona urodziła syna (S1), który stał się moim szwagrem , a także moim stryjem. Ta żona mojego ojca, , czyli moja przybrana córka, również miała syna (S2).
Ja próbuje modelować te relacje w prologu, więc w końcu będę mógł wpisać:
| ?- grandfather(i,i).
I będę mieć „tak” lub „nie” na niezależnie od tego, czy jestem moim własnym dziadkiem, czy nie.
Oto kod Pisałem tak daleko (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).
Teraz mam wiele kłopotów z definicjami kołowych tak, że dostać się do nieskończonej pętli podczas uruchamiania kwerendy : dziadek (ja, i).
Na przykład mam:
(1 ms) yes {trace} | ? - dziadek (ja, i). 1 1 Połączenie: dziadek (i, i)?
2 2 Zadzwoń: dziadek (i, i)?
3 3 Zadzwoń: rodzic (i, _103)?
4 4 Zadzwoń: dziecko (_127, i)?
5 5 Zadzwoń: rodzic (i, _151)?
6 6 Zadzwoń: dziecko (_175, i)?
7 7 Zadzwoń: rodzic (i, _199)?
8 8 Zadzwoń: dziecko (_223, i)?
9 9 Zadzwoń: rodzic (i, _247)?
10 10 Zadzwoń: dziecko (_271, i)?
11 11 Zadzwoń: rodzic (i, _295)?
12 12 Zadzwoń: dziecko (_319, i)?
13 13 Połączenie: rodzic (i, _343)?
14 14 Zadzwoń: dziecko (_367, i)?
15 15 Zadzwoń: rodzic (i, _391)?
...
To dlatego, że dziecko określa się jako nie mający rodzica, a rodzic określa sam ma posiadanie dziecka (jak zobaczysz w powyższych orzeczników napisałem).
Czy ktoś może mi pomóc ponownie zdefiniować moje predykaty dla tych relacji, aby móc stwierdzić, czy jestem moim własnym dziadkiem?
Heh, ja rzeczywiście miał to zrobić dla mojej klasy AI. Zastanawiam się, czy nadal mam kod ... Zobaczę, kiedy wrócę do domu. Pamiętam, że to też boli mój mózg. –
Używają Prolog w West Virgina? ;-) –
@ T.E.D .: Shh! TheTXI Cię usłyszy! –