gpt4 book ai didi

prolog - 如何停止序言中规则的重复

转载 作者:行者123 更新时间:2023-12-04 06:56:52 24 4
gpt4 key购买 nike

在我的序言规则中

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

当 parent 有两个 child 时,这对夫妇会出现两次。我们怎样才能防止这种情况发生?

最佳答案

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

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

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

Pradeep, based on your comment below, here is a more complete solution.



为了防止相同的答案出现两次,有多种选择。我们可以建立一个解决方案列表,并且只添加一个新发现的解决方案,如果它不在列表中。或者使用使用 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也叫。

关于prolog - 如何停止序言中规则的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2460018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com