2009-03-24 10 views
8

l'ho fatto, ma non è che mostra le risposte quando chiedo circa i fratelli, sorelle, zii, zieProlog Albero genealogico

Questo è ciò che ho scritto, cosa c'è di sbagliato?

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

E un'altra cosa, come ottimizzo la regola del fratello in modo che X non sia fratello di se stesso.

risposta

5

Sembra che alcuni dei vostri assiomi siano errati o mancanti, se si sta tentando di replicare il diagramma.

mancante:

female(jane). 

father(john, bob). 

sbagliato:

father(john, sue). 

Questo potrebbe causare la regola di pari livello al conflitto. Ma cosa ne so di prolog

+0

+1, non ho la prova coloro –

3

La tua regola di fratello verifica già che brother(bob, bob) avrà esito negativo perché chiama sibling(X, Y), che controlla il controllo per assicurarsi che sia già X \= Y.

Inoltre, sembra come se tutto funziona sulla mia macchina, ma ho dovuto cambiare i trattini su queste linee:

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ì, sembrano identici, ma i trattini nella versione superiore sono leggermente più lunghi ... e sembravano causare problemi quando "consultavo" il file.

L'ho preso solo perché ho creato uno schema di colori Prolog per Notepad ++, se qualcuno è interessato posso postarlo online.

+0

I trattini più lunghi sono probabilmente em o en trattini creati da alcuni word processor intelligente –

+0

Sì sto cercando di indovinare che era copia & incollato da qualche altra parte rispetto a dove è stato scritto il resto :) –

1

per ottimizzare la regola del fratello per X non è fratello di se stesso.

Si dovrebbe fare:

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

avete una forte base di dati dei fatti e un predicato molto importante chiamato parent(X,Y). Pensa logicamente all'approccio.

  • Chi è un fratello/sorella:
    a) Un maschio/femmina, quindi male(X) o female(X) deve essere dentro il predicato
    b) X e Y hanno lo stesso, ma attenzione ad utilizzare mother o Funzione father, perché altrimenti il ​​risultato verrà mostrato due volte.
    PS: assicurarsi che X/=Y. =)

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

  • Chi è lo zio/zia (un po 'complicato, ma non molto):
    a) è un maschio/femmina.
    b) La zia/lo zio è sorella/fratello della madre o del padre di pari livello.

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

PS: la zia può anche essere considerata la moglie del fratello di mamma o papà (la moglie di zio) del fratello. Ma in questo caso è necessario introdurre un nuovo fatto che esprima un married_couple.

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

Spero che questo funziona;)

1

tua zia/2 predicati non sono messi insieme, quindi Prolog assume un nonno/2 è la zia/2. Metterli insieme come qui sotto o utilizzare

:- discontiguous(aunt/2). 

Si utilizza coniuge/2, ma non definirlo. Inoltre, Prolog presume che ci dovrebbe essere un predicato di pari livello/2 da qualche parte e usa padre/2. Lo fa perché definisci la lista dei fratelli nella parte inferiore del tuo KB. Ancora una volta, metterli insieme come di seguito.

Come indicato in altre risposte, è possibile utilizzare non (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

prima:

mettere i vostri fatti al inizio del codice!

e per il fratello:

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

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

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