我有一个谓词 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/