gpt4 book ai didi

prolog - 在 Prolog 中查找列表中某个值的所有位置

转载 作者:行者123 更新时间:2023-12-02 09:01:47 25 4
gpt4 key购买 nike

我的作业是这样的:编写一个程序来读取整数x和整数列表L;然后将x的所有位置的列表定位到L中,并返回结果列表。例如,对于 x=2L=[1,2,3,4,2,5,2,6] 程序应返回列表 R=[2,5,7].

到目前为止,我已经能够编写 indexOf 谓词:

indexOf([E|_], E, 1).
indexOf([_|T], E, I) :- indexOf(T, E, I2), I is I2 + 1.

但是,这不会“返回”列表。所以:

indexOf([a,b,c,a,d], a, R).
R = 1;
R = 4

我想做这样的事情:

findAll([a,b,c,a,d], a, R).
R = [1, 4]

但我不确定如何将值收集到列表中。

这是一项学校作业,因此我希望能在正确的方向上插入。

最佳答案

轻推:您找到了索引,但没有收集它们。

indices(List, E, Is) :-
indices_1(List, E, Is, 1).

对于空列表,索引列表为空,元素并不重要

indices_1([], _, [], _).

如果元素类似于头部,则收集索引。

indices_1([E|Xs], E, [I|Is], I) :-
I1 is I + 1,
indices_1(Xs, E, Is, I1).

这需要另一个子句才能正常工作。

编辑:

一种方法是:

indices_1([X|Xs], E, Is, I) :- dif(X, E),
I1 is I + 1,
indices_1(Xs, E, Is, I1).

在前面的子句中,列表头和元素是统一的。在本条款中,它们是明显不同的。这意味着对于第一个参数中列表的元素,两个子句中只有一个为真。

编辑:

另一种方法是使用 findallnth1:

indices(List, E, Is) :-
findall(N, nth1(N, List, E), Is).

关于prolog - 在 Prolog 中查找列表中某个值的所有位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222220/

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