gpt4 book ai didi

prolog - 使用 not 设置交集谓词 Prolog

转载 作者:行者123 更新时间:2023-12-03 20:20:19 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的谓词,它将两个列表作为输入,结果是由前两个列表的交集组成的第三个列表。
我决定使用逻辑语句来做。我很确定我的逻辑是正确的,但我的谓词不起作用。有任何想法吗?:

element(X,[H|T]) :- 
X=H
;
element(X,T).

intersection(L1,L2,R) :-
not((
element(A,L1),
not(element(A,L2))
)),
not((
element(A,L1),
not(element(A,R))
)).

请不要发布替代方法,我想知道为什么这个方法每次都返回 FALSE。

最佳答案

你的定义是正确的太笼统了。它承认例如那个[]是任何两个太笼统的列表的交集。 IE。 intersection([],[a],[a]) 错误地成功了.它缺少第三个“for all”习语,说明两个列表中的所有元素都将在结果列表中。

但否则你的定义是好的。对于地面情况。有点不寻常的是,交集是第一个而不是最后一个参数。对我来说很烦人的是变量名。我相信R意思是“结果”,因此是交集。和 L1L2是建立交集的两组。

不过,它有点太笼统了——就像许多 Prolog 谓词一样——想想 append([], non_list, non_list) .除了列表,您的定义还承认既不是列表也不是部分列表的术语:

?- intersection(non_list1,[1,2|non_list2],[3,4|non_list3]).

为了让它真正有用,安全,像这样使用它:
?- when(ground(intersection(I, A, B)), intersection(I, A, B)).

或者:
?- (  ground(intersection(I, A, B))
-> intersection(I, A, B)
; throw(error(instantiation_error, intersection(I, A, B)))
).

或者,使用 iwhen/2 :
?- iwhen(ground(intersection(I, A, B)), intersection(I, A, B) ).

顺便说一句,不如写 (\+)/1代替 not/1 .

关于prolog - 使用 not 设置交集谓词 Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630790/

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