Prolog 序言中的双胞胎将重复答案

Prolog 序言中的双胞胎将重复答案,prolog,Prolog,假设我有3个孩子 person(pet,fox,date(5,may,2004),unemployed). person(jim,fox,date(5,may,2004),unemployed). person(george,fox,date(9,december,2002),unemployed). child(X):-X=person(pet,fox,date(5,may,2004),unemployed). child(X):-X=person(jim,fox,date(

假设我有3个孩子

person(pet,fox,date(5,may,2004),unemployed).  
person(jim,fox,date(5,may,2004),unemployed).  
person(george,fox,date(9,december,2002),unemployed).  

child(X):-X=person(pet,fox,date(5,may,2004),unemployed).  
child(X):-X=person(jim,fox,date(5,may,2004),unemployed).  
child(X):-X=person(george,fox,date(9,december,2002),unemployed).  
我想要这些孩子的双胞胎

twins(Child1,Child2) :-
    child(Child1),child(Child2),
    Child1=person(Fname1,_,Date1,_),
    Child2=person(Fname2,_,Date2,_),
    Fname1\=Fname2,
    Date1=Date2.
问题是当我问prolog twins(X,Y)时。我会再得到一些答案。如何预防

?- twins(X,Y).  
X = person(pet, fox, date(5, may, 2004), unemployed),  
Y = person(jim, fox, date(5, may, 2004), unemployed) ;  
X = person(jim, fox, date(5, may, 2004), unemployed),  
Y = person(pet, fox, date(5, may, 2004), unemployed) ;  
false.  

您可以通过对该对的元素施加非对称顺序来防止生成所有置换:

?- twins(X, Y), X @< Y.
X = person(jim, fox, date(5, may, 2004), unemployed),
Y = person(pet, fox, date(5, may, 2004), unemployed) ;
false.
child(X) :-
    person(FirstName, LastName, DOB, Status),
    X = person(FirstName, LastName, DOB, Status).