如何在prolog中停止重复规则

时间:2010-03-17 05:10:26

标签: prolog

在我的prolog规则中

marriedcouple(X,Y) :-
    parent( (X,Z), bornin(_) ),
    parent( (Y,Z), bornin(_) ),
    female(X),
    male(Y)
    ;
    male(X),
    female(Y),
    different(X,Y).
当父母有两个孩子时,这对夫妇会两次出现。我们怎样才能阻止这种情况?

2 个答案:

答案 0 :(得分:2)

鉴于你有female/1& male/1预测谓词变得非常简单。

marriedcouple(X,Y) :-
    parent( (X,Z), bornin(_) ),
    parent( (Y,Z), bornin(_) ),
    female(X),
    male(Y).

但是,如果您想查看X和Y是否相同,请使用(\==)/2运算符表示“不相同”或(\=)/2表示“不可统一”。


  

Pradeep,根据您在下面的评论,这是一个更完整的解决方案。

为了防止两次回复相同的答案,有很多选择。我们可以构建一个解决方案列表,只添加一个新找到的解决方案(如果它尚未在列表中)。或者使用使用assert/1谓词合并状态的方法。

我选择了后者。

?- solve.

solve :-
    marriedcouple(Dad, Mum),
    not( found( marriedcouple(Dad, Mum) ) ),
    assert( found( marriedcouple(Dad, Mum) ) ),
    write( [Dad, Mum] ),
    nl,
    fail.

marriedcouple(Dad, Mum) :-
    parent(Dad, Child),
    parent(Mum, Child),
    male(Dad),
    female(Mum).

male(aaron).
male(adam).

female(betty).
female(eve).

parent(aaron, callum).
parent(aaron, david).
parent(adam, abel).
parent(adam, cain).
parent(betty, callum).
parent(betty, david).
parent(eve, abel).
parent(eve, cain).

当我运行时,我得到以下内容:

[aaron,betty];
[adam,eve];
No.

小心使用assert/1谓词,因为您可能会在程序中引入不必要的副作用。您可能还需要进行适当的retract/1来电。

答案 1 :(得分:1)

只是通过双重理论解决方案:

marriedcouple(Dad, Mum) :-
    male(Dad), female(Mum),
    not(notMarriedcouple(Dad,Mum)).

notMarriedcouple(Dad, Mum) :-
    male(Dad), female(Mum),
    not((parent(Dad, Child), parent(Mum, Child))).