比较序言调用中的两个解决方案
Compare two solution in a prolog call
我写的序言程序如下。现在,当我运行 同父异母姐妹断言为halfsister(X,Y)
。我得到了结果
X = ann
Y = sylvia ? ;
X = sylvia
Y = ann ? ;
但两者是相同的结果,但显示了两次。如何让程序只显示一次相同的结果?
我的序言代码:
parent(john,ann).
parent(jim,john).
parent(jim,keith).
parent(mary,ann).
parent(mary,sylvia).
parent(brian,sylvia).
male(keith).
male(jim).
male(brian).
female(sylvia).
female(ann).
female(marry).
female(john).
brother(X,Y):-parent(Z,X),parent(Z,Y),male(X),X\==Y.
uncle(X,Y):-brother(X,Z),parent(Z,Y).
halfsister(X,Y):-
parent(A,X),
parent(A,Y),
parent(B,X),
parent(C,Y),
\+(A = B),
\+(A = C),
\+(B = C),
female(Y).
感谢您宝贵的时间。
我认为没有必要消除这种“重复”,因为谓词halfsister(X,Y)
的意思是“Y是X的同父异母姐妹”。您有两个答案,一个表示“sylvia is ann's half-sister”,另一个表示“ann is sylvia's half-sister”。所以这里没有错。
如果你执意要消除,可以试试:
halfsister(X,Y):-
parent(A,X),
parent(A,Y),
parent(B,X),
parent(C,Y),
\+(A = B),
\+(A = C),
\+(B = C),
female(Y),
( female(X)
-> X @< Y
; true
).
查询:
?- halfsister(X,Y).
X = ann,
Y = sylvia ;
false.
我写的序言程序如下。现在,当我运行 同父异母姐妹断言为halfsister(X,Y)
。我得到了结果
X = ann
Y = sylvia ? ;
X = sylvia
Y = ann ? ;
但两者是相同的结果,但显示了两次。如何让程序只显示一次相同的结果? 我的序言代码:
parent(john,ann).
parent(jim,john).
parent(jim,keith).
parent(mary,ann).
parent(mary,sylvia).
parent(brian,sylvia).
male(keith).
male(jim).
male(brian).
female(sylvia).
female(ann).
female(marry).
female(john).
brother(X,Y):-parent(Z,X),parent(Z,Y),male(X),X\==Y.
uncle(X,Y):-brother(X,Z),parent(Z,Y).
halfsister(X,Y):-
parent(A,X),
parent(A,Y),
parent(B,X),
parent(C,Y),
\+(A = B),
\+(A = C),
\+(B = C),
female(Y).
感谢您宝贵的时间。
我认为没有必要消除这种“重复”,因为谓词
halfsister(X,Y)
的意思是“Y是X的同父异母姐妹”。您有两个答案,一个表示“sylvia is ann's half-sister”,另一个表示“ann is sylvia's half-sister”。所以这里没有错。如果你执意要消除,可以试试:
halfsister(X,Y):- parent(A,X), parent(A,Y), parent(B,X), parent(C,Y), \+(A = B), \+(A = C), \+(B = C), female(Y), ( female(X) -> X @< Y ; true ).
查询:
?- halfsister(X,Y). X = ann, Y = sylvia ; false.