在prolog中生成列表

JmR*_*Rag 0 prolog

您好我想在Prolog中创建一个程序,给出一个数字列表和一个数字,它将所有数字位置的一致性附加到第二个列表中.

例如,对于list (5,10,4,5,6,5)number =5新列表应该是

(1,4,6)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的代码

positions(X, [X|_],1).
positions(X, [P|T], N) :- positions(X, T, N1), N is N1+1.

find(X, [H|T] ,Z) :-positions(X,[H|T],N) , append([],N,Z).
Run Code Online (Sandbox Code Playgroud)

这些位置返回列表中X的第一个并发,但我不知道如何继续.你能帮助我吗?

mag*_*gus 5

如果它不是一个赋值,那么你可以使用内置的findall/3和nth1/3受益:

?- findall(Nth, nth1(Nth, [5,10,4,5,6,5], 5), Nths).
Nths = [1, 4, 6].
Run Code Online (Sandbox Code Playgroud)

只需要使用第n1个短语,并运行它,您就可以看到它正在回溯并找到多个解决方案,然后我们只使用findall将它们收集到一个列表中.

?- nth1(Nth, [5,10,4,5,6,5], 5).
Nth = 1 ;
Nth = 4 ;
Nth = 6.
Run Code Online (Sandbox Code Playgroud)

nth1/3,当第一个参数使用变量时,就是说'给我一个列表索引,在第二个参数列表中找到第三个参数的位置.