2009-03-24 14 views
8

lo hice pero no mostrando respuestas cuando le pregunto acerca de los hermanos, hermanas, tíosProlog Árbol genealógico

Esto es lo que he escrito, lo que está mal?

/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/ 
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/ 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 

sibling(X, Y) :- 
     parent(Z, X), 
     parent(Z, Y), 
     X \= Y. 

sister(X, Y) :- 
     sibling(X, Y), 
     female(X). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X). 

parent(Z,Y) :- father(Z,Y). 
parent(Z,Y) :- mother(Z,Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

Y una cosa más, ¿cómo puedo optimizar la regla del hermano para que X no sea hermano de sí mismo.

Respuesta

5

Parece que algunos de sus axiomas son incorrectos o faltan, si está intentando reproducir el diagrama.

falta:

female(jane). 

father(john, bob). 

equivocada:

father(john, sue). 

Esto podría causar la regla de hermanos a los conflictos. Pero qué sé sobre prolog

+0

+1, no he probado los –

3

Su regla de hermano ya verifica que brother(bob, bob) fallará porque llama a sibling(X, Y), que hace la verificación para asegurarse X \= Y ya.

Además, parece que todo funciona en mi máquina, pero tenía que cambiar los guiones en estas líneas:

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

a:

aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

Sí, ellos parecen idénticos, pero los guiones en la versión superior son ligeramente más largos ... y parecían causar problemas cuando "consultaba" el archivo.

Solo capté eso porque creé un esquema de color Prolog para Notepad ++, si alguien está interesado, puedo publicarlo en línea.

+0

Los guiones más largos son probablemente em o guiones cortos creados por algunos procesadores –

+0

palabra inteligente Sí supongo que era copiar y pegar de otro lugar que no sea donde se escribió el resto :) –

1

para optimizar la regla del hermano para X no es hermano de sí mismo.

que debe hacer:

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not X=Y. 
1

usted tiene una fuerte base de datos de hechos y un predicado muy importante que se llama parent(X,Y). Piensa lógicamente sobre el enfoque.

  • Quién es un hermano/hermana:
    a) A macho/hembra, por lo tanto male(X) o female(X) debe estar dentro del predicado
    b) X e Y tienen el mismo, pero tener cuidado de usar ya sea mother o father función, porque de lo contrario el resultado se mostrará dos veces.
    PD: asegúrese de X/=Y. =)

Ej .:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

  • Quién es el tío/tía (un poco complicado, pero no mucho):
    a) es un hombre/mujer.
    b) La tía/tío es hermana/hermano de la mamá o el papá de su hermano.

Ej .:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).

PS: tía también puede ser considerada como la esposa del hermano de la madre o padre (la esposa del tío) de hermanos. Pero en este caso debe introducir un hecho nuevo que exprese un married_couple.

aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

Hope esto funciona;)

1

tu tía/2 predicados no se colocan juntos, por lo tanto, asume Prolog abuelo/2 es la tía/2. Colóquelos juntos como a continuación o use

:- discontiguous(aunt/2). 

Utilice spouse/2, pero no lo defina. Además, Prolog supone que debe haber un predicado hermano/2 en alguna parte y usa padre/2. Hace esto porque defines una lista de hermanos en la parte inferior de tu KB. De nuevo, colóquelos juntos como a continuación.

Como se indica en otras respuestas, puede usar not (X = Y).

parent(Z,Y) :- father(Z,Y) ; mother(Z,Y). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

sibling(X,Y) :- 
    parent(A,X), 
    parent(A,Y), 
    not(X = Y). 


sister(X, Y) :- 
     sibling(X, Y), 
     female(X), 
     not(X = Y). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not(X = Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 


male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 
female(jane). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 
0

primera:

poner los hechos en el comenzando de su código!

y para el hermano:

equal(X,Y) :- 
    X=Y. 

different(X,Y):- 
    not(equal(X,Y)). 

brother(X, Y) :- 
    sibling(X, Y), 
    male(X), 
    different(X,Y).