La siguiente historia es de N. Wirth (1976) Algorithms + Datastructures = Programs.¿Cómo puedo implementar "Soy mi propio abuelo" en Prolog?
que casó con una viuda (llamémosla W) que tenía una hija mayor de edad (llamarla D). Mi padre (F), que nos visitó con bastante frecuencia, se enamoró de mi hijastra y se casó con ella. Por lo tanto, mi padre se convirtió en mi yerno y mi hijastra se convirtió en mi madre. Unos meses después, mi esposa dio a luz a un hijo (S1), que se convirtió en el cuñado de mi padre, así como como mi tío. Esta esposa de mi padre, es decir, mi hijastra, también tenía un hijo (S2).
que estoy tratando de modelar estas relaciones en el prólogo por lo que finalmente voy a ser capaz de escribir:
| ?- grandfather(i,i).
Y que me dieron un "sí" o un "No" en la si soy o no mi propio abuelo
Este es el código que he escrito hasta ahora (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).
En este momento estoy teniendo muchos problemas con las definiciones circulares para que me meto en bucles infinitos cuando se ejecuta la consulta : abuelo (yo, yo).
Por ejemplo, tengo:
(1 ms) sí {trace} | ? - abuelo (yo, yo). 1 1 Llamada: abuelo (i, i)?
2 2 Llamar: abuelo (i, i)?
3 3 Llamar: padre (i, _103)?
4 4 Llamar: hijo (_127, i)?
5 5 Llamar: padre (i, _151)?
6 6 Llamar: hijo (_175, i)?
7 7 Llamar: padre (i, _199)?
8 8 Llamar: hijo (_223, i)?
9 9 Llamar: padre (i, _247)?
10 10 Llamar: hijo (_271, i)?
11 11 Llamar: padre (i, _295)?
12 12 Llamar: hijo (_319, i)?
13 13 Llamar: padre (i, _343)?
14 14 Llamar: hijo (_367, i)?
15 15 Llamar: padre (i, _391)?
...
Esto se debe a que los niños se define como ha tener un padre, y el padre se autodefine ha de tener un hijo (como se verá en los predicados anteriores he publicado).
¿Alguien me puede ayudar a volver a definir mis predicados para estas relaciones para poder determinar si soy mi propio abuelo?
Je, yo en realidad tenía que hacer eso para mi clase de AI. Me pregunto si aún tengo el código ... Lo veré cuando llegue a casa. Recuerdo que también lastimó mi cerebro. –
Usan Prolog en West Virgina? ;-) –
@ T.E.D .: Shh! ¡TheTXI te escuchará! –