在prolog中生成列表

时间:2014-02-18 17:01:14

标签: prolog

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

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

(1,4,6)

这是我到目前为止的代码

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).

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

2 个答案:

答案 0 :(得分:5)

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

?- findall(Nth, nth1(Nth, [5,10,4,5,6,5], 5), Nths).
Nths = [1, 4, 6].

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

?- nth1(Nth, [5,10,4,5,6,5], 5).
Nth = 1 ;
Nth = 4 ;
Nth = 6.

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

答案 1 :(得分:2)

你有一些好主意,但我会建议一些事情:

1)在Prolog中,给变量赋予有意义的名称

是有益的

2)使用累加器,您只需要位置并附加

3)使用不同的基本案例

positions([Num|List],Num,[Index|SubResult],Index) :- Index2 is Index+1, 
                                        positions(List,Num,SubResult,Index2).

positions([NotNum|List],Num,Result,Index) :- NotNum \= Num,
                                          Index2 is Index+1, 
                                          positions(List,Num,Result,Index2).

positions([],Num,[],Index).

在我们的第一个一般情况下,我们可以看到数字匹配,所以我们去查找我们的子列表中有多少结果,我们称之为SubResult,然后将当前索引推送到我们的{{1 }}

下一个一般情况,数字不统一,我们的SubResultResult,所以我们称它们为同一个东西。

在我们的最后一种情况(基本情况)中,我们可以看到列表为空,在这种情况下,我们返回一个空列表,因为我们无法匹配空列表。

您可以看到上述规则是与订单无关的,这在Prolog中是非常有价值的。这意味着您可以按任何顺序排列规则,并且Prolog程序的语义保持不变。使用统一来实现这一目标可以防止将来的调试痛苦。

我们可以用以下方式包装我们的谓词

SubResult

这将允许查询positions(Num, List, Positions) :- positions(List, Num, Positions, 1).