gpt4 book ai didi

prolog - 序言中对称关系的传递闭包

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:14 25 4
gpt4 key购买 nike

我是序言初学者,我想创建“兄弟”关系。

关系应该是对称的,因为如果 brother(alin, alex) 为真,brother(alex, alin) 也应该为真。

它也应该是可传递的,如果 brother(alin, alex)brother(alex, claudiu) 为真,brother(alin, claudiu) 也应该如此。

结合 to 属性,如果 brother(alex, alin)brother(alex, claudiu) 为真,则 brother(alin, claudiu) 也应该是真的。

这是我的代码:

r_brother(alin, alex).
r_brother(alin, ciprian).
r_brother(alex, claudiu).

s_brother(X, Y) :- r_brother(X, Y).
s_brother(X, Y) :- r_brother(Y, X).

brother(L1, L2) :-
t_brother(L1, L2, []).

t_brother(L1, L2, _) :-
s_brother(L1, L2).

t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
t_brother(L3, L2, [L3 | IntermediateNodes]).

r_brother - 是基本关系

s_brother - 是对称的兄弟关系(这很好用)

t_brother - 这应该是传递和对称关系,我保留了中间节点所以我没有得到循环

问题是答案:

?- brother(X, alin).

是:

X = alex ;
X = ciprian ;
X = alin ;
X = alin ;
X = alin ;
X = alin ;
X = alex ;
X = alex ;
X = alex ;
X = alex ;
X = ciprian ;
X = ciprian ;
X = claudiu ;
X = claudiu ;
false.

看了trace,知道是什么问题了,但是不知道怎么解决。

alin 不应该是一个可能的答案,其他人应该出现一次。

最佳答案

我认为最基本的问题是你没有检查是否已经在 t_brother/3 的第一个子句中找到了 L2。并且初始的 L1 应该添加到 brother/2 的列表中:

brother(L1, L2) :-
t_brother(L1, L2, [L1]). % <-- [L1] instead of []

t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L2),
\+ member(L2, IntermediateNodes). % <-- added this check

t_brother(L1, L2, IntermediateNodes) :- % <-- this clause is unchanged
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
t_brother(L3, L2, [L3 | IntermediateNodes]).

您仍然可以使用析取来缩短解决方案:

t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
( L2=L3
; t_brother(L3, L2, [L3 | IntermediateNodes])).

关于prolog - 序言中对称关系的传递闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28990855/

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