你有一些好的想法,但我會建議有兩件事情:
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