gpt4 book ai didi

list - 从 Prolog 中的列表创建集合

转载 作者:行者123 更新时间:2023-12-01 23:30:48 26 4
gpt4 key购买 nike

所以基本上我的任务是使用包含 2 个参数的谓词从给定列表创建一个集合。

第一个是列表,第二个是集合的值。

然而,它以某种方式给了我一个列表,其中包含作为头部的集合和带有变量的尾部:

2 ?- list2set([2,3,4,4] , X).
X = [2, 3, 4|_G2840] .

这就是代码:

list2set( [] , _).
list2set([ListH|ListT] , Set ) :- member(ListH, Set) , list2set(ListT , Set).

这似乎是我犯的一个非常基本的错误。

最佳答案

首先,Prolog 中没有集合。我们只有列表1。因此,您可以做的是将具有重复元素的列表与不具有重复元素的列表相关联。 list_nub/2会是这样的定义。

根据您当前的定义:

list2set([], [a]) 已经成功了,这不可能是对的。所以你的定义太笼统了。您需要将 list2set([],_) 替换为 list2set([],[])

然后,将 member(ListH, Set) 替换为 member(ListH,ListT)

对于元素不存在的情况,您需要另一个规则:

list2set([] , []).
list2set([E|Es] , Set ) :-
member(E, Es) ,
list2set(Es , Set).
list2set([E|Es] , [E|Set] ) :-
maplist(dif(E), Es),
list2set(Es , Set).

避免冗余答案的更紧凑的定义是 list_nub/2 .


1) 严格来说,可以通过属性变量2 扩展统一以实现 ACI - 统一有真正的集合。

2)根据我的粗略理解,这需要在 SICStus 中实现属性变量。 SWI 或 YAP 中当前的其他接口(interface)很可能不够用;因为它们已经适用于 CLP(B)。参见 this discussion了解更多。

关于list - 从 Prolog 中的列表创建集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37014725/

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