gpt4 book ai didi

list - 在 Prolog 中搜索(相同)两个元素的列表

转载 作者:行者123 更新时间:2023-12-02 06:00:56 25 4
gpt4 key购买 nike

如何在 Prolog 中的列表中搜索多次出现的特定元素?

例如,如果我们在列表 [1,2,3,4,1] 中搜索元素 1,Prolog 应该返回 true,但对于所有其他数字,否则为 false

这是我目前所拥有的:

duplicate([], _) :-
false,
!.
duplicate([X|_], X) :-
true,
!.
duplicate([H|T], X) :-
T = [_|T1],
duplicate(T, X),
duplicate(T1, X).

我的基本想法是搜索列表直到找到我要查找的元素,然后再次搜索列表的尾部以查找该项目。我不想使用 Prolog 提供的 member() 函数。

如果查询要求 Prolog 还应该返回出现不止一次的元素:duplicate([1,2,3,4,1], X),应该打印 X = 1

最佳答案

这里是使用语法的明显版本。从某种意义上说,我们正在描述包含重复项的列表的结构。该结构如下:

  • 首先,有什么(...),
  • 然后是元素([V]),
  • 再说一遍 (...)
  • 再次是元素 ([V])
  • 之后是任何内容。
duplicate(L, V) :-
phrase(( ..., [V], ..., [V], ... ), L).

... --> [] | [_], ... .

作为一个缺点,这个版本会为这样的查询产生冗余的答案

?- duplicate([a,a,a],a).

这可以通过使用 dif/2 来克服:

duplicate(L, V) :-
phrase(( all(dif(V)), [V], all(dif(V)), [V], ... ), L).

非终结符的定义all//1 .

关于list - 在 Prolog 中搜索(相同)两个元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467630/

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