Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在prolog中生成列表_Prolog - Fatal编程技术网

在prolog中生成列表

在prolog中生成列表,prolog,Prolog,您好,我想用Prolog编写一个程序,给定一个数字列表和一个数字,它会在第二个列表中附加数字位置的所有一致性 例如,对于列表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)

您好,我想用Prolog编写一个程序,给定一个数字列表和一个数字,它会在第二个列表中附加数字位置的所有一致性

例如,对于列表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).

positions返回列表中X的第一个并发,但我不知道如何继续。你能帮我吗?

你有一些好主意,但我建议你做几件事:

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).
在我们的第一个一般情况下,我们可以看到数字匹配,因此我们可以找到子列表中有多少个结果,我们将其称为子结果,然后将当前索引推送到子结果上

下一个一般情况是,数字不统一,我们的结果是子结果,所以我们把它们称为相同的东西

在最后一种情况下,我们可以看到列表为空,在这种情况下,我们返回一个空列表,因为我们无法与空列表进行匹配

您可以看到,上面的规则是顺序独立的,这在Prolog中非常有价值。这意味着您可以按任何顺序排列规则,并且Prolog程序的语义保持不变。使用统一来实现这一点可以避免将来调试中的痛苦

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

positions(Num, List, Positions) :- positions(List, Num, Positions, 1).

这将允许查询位置5、[5,10,4,5,6,5]和位置。

如果不是分配,则可以使用内置findall/3和nth1/3:

?- findall(Nth, nth1(Nth, [5,10,4,5,6,5], 5), Nths).
Nths = [1, 4, 6].
只使用第nth1个短语,运行它,您可以看到它是回溯并找到多个解决方案,然后我们使用findall将它们收集到一个列表中

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

当使用变量作为第一个参数时,nth1/3会说“给我一个列表索引,第三个参数在第二个参数的列表中的位置。

+1因为我喜欢这个解决方案,而随机的因为你喜欢Pythonic这个词。”。没有Prolog等价术语听起来像是很酷的序言?序言?…@mbratch序言?我认为序言是我们这组形容词中最好的。Prolog是支持逻辑的吗?同意。在这些选项中,序言是我认为最好的。