【问题标题】:Prolog predicate - returns list with duplicates removed from specific predicateProlog 谓词 - 返回从特定谓词中删除重复项的列表
【发布时间】:2021-01-25 19:24:56
【问题描述】:

我是一个尝试编写谓词的菜鸟,但我有点卡住了。早些时候,我创建了一个名为remDuplicates/2 的谓词,如果谓词的第二个列表是删除了所有重复项的第一个列表,则该谓词将声明为真。请参阅下面的代码了解我正在使用的谓词。

   remDuplicates([], []).
   remDuplicates([H|T], [H|T1]) :- subtract(T,[H],T2), remDuplicates(T2, T1).

但是,现在我正在尝试创建一个新谓词,它使用remDuplicates 从一个名为remT/1 的列表中删除重复项。 remT/1 采用单个参数,应使用 remDuplicates 谓词删除所有重复项,然后返回新列表(没有任何重复项)。

我已经尝试过它应该如何开始,但实际上,我不知道从哪里开始。请在下面查看我的尝试开始;

  remT([]).
  remT([H|T]) :- remDuplicates([H|T],[H|T]).

非常感谢您对此的帮助。谢谢。

【问题讨论】:

  • Prolog中通常没有“返回”这样的东西,也没有可变变量。为什么需要这样的谓词?

标签: prolog return-value


【解决方案1】:

正如 Boris 告诉你的,在 Prolog 中没有“返回”这样的东西,但是,你可以像这样调用你的 remDuplicates/2

remDuplicates([1,2,2,3,4,5,7,5], T).

这样,T 将是没有重复的最终列表。然后,您可以在更大的谓词中使用它,或者只在终端上运行它,因为它会在屏幕上打印类似 T = [1,2,3,4,5,7] 的内容。

您还可以查看 sort/2 谓词,它与您的结果相似,已内置于 SWI-Prolog。

希望对你有帮助,
安德烈·平托

【讨论】:

  • 嗨@DrAntarctica - 感谢您的建议。无论如何我可以使用'remT'谓词而不必自己插入变量? (即将一个变量放入要打印的“remT”变量中,而用户不必这样做 - 就像我在下面的尝试)..
  • remT([])。 remT([H|T],X) :- remDuplicates([H|T],X).
  • 你可以像这样拥有 remT/1:remT(List) :- remDuplicates(List, X), write('New List: '), write(X)。编辑:我不知道我是否理解正确,但如果我没有理解正确,请随时澄清。
最近更新 更多