2014-02-18 94 views
0

你好我想在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的列表中第一個同意,但我不知道如何繼續。你可以幫我嗎?

回答

5

查詢。如果它不是一個任務,那麼你可以使用受益內置插件的findall/3和NTH1/3:

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

以剛NTH1短語和運行中,你可以看到它是回溯,尋找多種解決方案,那麼我們只不過是你找到它們將它們收集到一個列表中。

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

NTH1/3,使用用於所述第一參數的變量時,在說「給我在哪裏,其中第三參數在第二參數的列表中找到一個列表索引。

+0

+1,用於使用內置插件的漂亮整潔的解決方案。 – lurker

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

在我們的第一個一般的情況下,我們可以看到數字匹配,所以我們去鰭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).

+0

+1因爲我喜歡這個解決方案,而且隨機,因爲你喜歡「Pythonic」這個詞。沒有Prolog等價詞聽起來很酷(「prologish」?「prological」?...) – lurker

+0

@mbratch「prologgy」?我會說「prology」是我們的形容詞中最好的。序言是親邏輯? –

+1

同意。在這些選項中,「Prological」盡我所能地脫穎而出。 – lurker