你有一些好的想法,但我会建议有两件事情:
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).
在我们的第一个一般的情况下,我们可以看到数字匹配,所以我们去鳍d多少结果是在我们的子表,我们将调用SubResult
,然后推到我们SubResult
下一般情况下,数字不统一目前的指数,我们的Result
IS的SubResult
,让我们呼唤他们同样的事情。
在我们最后的情况下(基本情况),我们可以看到列表是空的,在这种情况下,我们返回一个空列表,因为我们无法匹配空列表。
您可以看到上述规则是与订单无关的,这在Prolog中非常有用。这意味着您可以按任意顺序排列规则,并且Prolog程序的语义保持不变。使用统一来实现这一点将防止调试中未来的痛苦。
我们可以换我们的谓词以下列方式
positions(Num, List, Positions) :- positions(List, Num, Positions, 1).
这将允许对positions(5,[5,10,4,5,6,5],Positions).
+1,用于使用内置插件的漂亮整洁的解决方案。 – lurker