在我的prolog规则中
marriedcouple(X,Y) :-
parent( (X,Z), bornin(_) ),
parent( (Y,Z), bornin(_) ),
female(X),
male(Y)
;
male(X),
female(Y),
different(X,Y).
当父母有两个孩子时,这对夫妇会两次出现。我们怎样才能阻止这种情况?
答案 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))).