比较序言调用中的两个解决方案

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

感谢您宝贵的时间。

  1. 我认为没有必要消除这种“重复”,因为谓词halfsister(X,Y)的意思是“Y是X的同父异母姐妹”。您有两个答案,一个表示“sylvia is ann's half-sister”,另一个表示“ann is sylvia's half-sister”。所以这里没有错。

  2. 如果你执意要消除,可以试试:

    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.