2016-07-05 8 views
2

ich alle Geschwister zusammen in folgenden Code zu bekommen versuche:bekommen alle Geschwister zusammen in Prolog

father_child(tom, sally). 
father_child(john, alfred). 
father_child(george, peter). 
father_child(tom, dick). 
father_child(john, harry). 
father_child(george, eliz). 
father_child(tom, james). 
father_child(john, ron). 
father_child(george, hermoine). 

siblings(X, Y):- father_child(Z, X), father_child(Z, Y), X @< Y. 

?- findall([X,Y], siblings(X,Y), L). 
L = [[alfred, harry], [alfred, ron], [dick, sally], [dick, james], [harry, ron], [eliz, peter], [eliz, hermoine], [james|...], [...|...]]. 

Aber es gibt nur Paare. Wenn ich nicht wüsste, wie viele Geschwister da sind und ich eine Liste von Geschwisterlisten haben möchte (wie folgt), wie kann ich das schaffen?

[[a, b, c], [d, e], [x, y, z, w]] 

Antwort

3

Sie müssen nur setof/3 oder bagof/3 verwenden. Dies ist ein gutes Beispiel für etwas, das diejenigen tun können, findall/3 kann nicht (einfach). Mit nichts als die father_child/2 Tabelle definiert:

?- bagof(C, father_child(F, C), Siblings). 
F = george, 
Siblings = [peter, eliz, hermoine] ; 
F = john, 
Siblings = [alfred, harry, ron] ; 
F = tom, 
Siblings = [sally, dick, james]. 

Sie können natürlich Nest diese in ein findall/3:

?- findall(Siblings, 
      bagof(C, father_child(F, C), Siblings), 
      Ss). 
Ss = [[peter, eliz, hermoine], [alfred, harry, ron], [sally, dick, james]]. 

Sie sollten versuchen und sehen, was passiert, wenn man bagof/3 anstelle von findall/3. (Hinweis: mit findall/3 wie folgt ist das Schreiben bagof(Siblings, F^bagof(C, father_child(F, C), Siblings), Ss))

+0

Perfekt, das ist genau das, was ich wollte. Vielen Dank. – rnso