Prolog - 如何 return 每个元素只出现一次的列表?
Prolog - How can I return a list where each element appears only once?
我有一个谓词 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).
returns 是的。那是一半 - 我希望 X 被实例化为 [1,2,3] - 但我不确定在这种情况下如何使 X 为真。任何帮助和解释将不胜感激。
sort/2 删除重复项(msort/2 保留重复项,如果这是您想要的。
另外:https://www.swi-prolog.org/pldoc/man?predicate=list_to_set/2
您的 Prolog 应该警告您在第一个子句中有一个 单例,即
set([],OutList).
意思是当执行命中这样的子句时,成功,但OutList
保持未绑定状态。
现在应该清楚您需要用空列表替换 OutList
。
另一个错误位于第二个子句中。
append([X], OutList, OutListNew)
应该改为 append([X], OutListNew, OutList)
。作为style note,可以这样统一代入:[X|OutListNew]=OutList
,然后移入head.
我有一个谓词 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).
returns 是的。那是一半 - 我希望 X 被实例化为 [1,2,3] - 但我不确定在这种情况下如何使 X 为真。任何帮助和解释将不胜感激。
sort/2 删除重复项(msort/2 保留重复项,如果这是您想要的。
另外:https://www.swi-prolog.org/pldoc/man?predicate=list_to_set/2
您的 Prolog 应该警告您在第一个子句中有一个 单例,即
set([],OutList).
意思是当执行命中这样的子句时,成功,但OutList
保持未绑定状态。
现在应该清楚您需要用空列表替换 OutList
。
另一个错误位于第二个子句中。
append([X], OutList, OutListNew)
应该改为 append([X], OutListNew, OutList)
。作为style note,可以这样统一代入:[X|OutListNew]=OutList
,然后移入head.