在prolog中生成列表
您好,我想用Prolog编写一个程序,给定一个数字列表和一个数字,它会在第二个列表中附加数字位置的所有一致性 例如,对于列表5、10、4、5、6、5和number=5,新列表应为在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)
(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是支持逻辑的吗?同意。在这些选项中,序言是我认为最好的。