Prolog 序言中的双胞胎将重复答案
假设我有3个孩子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(
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).