list - Prolog - 如何返回每个元素仅出现一次的列表?

标签 list prolog logic unification

我有一个谓词 set/2 ,它应该将第二个参数实例化到一个列表,该列表的元素只是第一个参数中每个术语的一次出现。到目前为止我所拥有的是:

set([],OutList).
set([X|InList],OutList) :- \+member(X,InList), append([X], OutList, OutListNew), set(InList,OutListNew).                      
set([X|InList],OutList) :- member(X,InList), set(InList,OutList).

并调用 set/2:

set([1,1,2,3],X).

返回真。这已经完成了一半 - 我希望 X 被实例化为 [1,2,3] - 但我不确定如何在这种情况下使 X 为真。任何帮助和解释将不胜感激。

最佳答案

你的 Prolog 应该警告你在第一个子句中有一个单例,即

set([],OutList).

这意味着当执行命中此类子句时,它成功,但OutList保持未绑定(bind)状态。

现在应该清楚了,您需要用空列表替换 OutList

另一个错误位于第二个子句中。

append([X], OutList, OutListNew) 应该改为 append([X], OutListNew, OutList)。作为样式注释,可以用这样的统一来代替:[X|OutListNew]=OutList,然后移到头部。

关于list - Prolog - 如何返回每个元素仅出现一次的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67996776/

相关文章:

algorithm - Lisp:如何从列表中包含的列表中获取元素的所有可能组合?

Java:在没有lib的情况下实现简单列表

c++ - 在 C 或 C++ 中实现 Prolog

Prolog 查询 - 试图理解这个结果是如何发生的

c - 如何使用其他整数的值加载 32 位整数

mysql - 如何编写这个 MySQL 查询?

list - 如何遍历 TI-83 计算器程序中的列表

python - 查找两个列表的重叠,保留序列顺序

recursion - Prolog:删除列表中的所有空格

c - C中的位设置逻辑