2010-04-06 96 views
1

我試圖在序言中找到列表的第n個元素。這裏是我嘗試使用代碼:序言:查找列表中的第N個元素

Cells = [OK, _, _, _, _, _] . 

... 

next_safe(_) :- 
facing(CurrentDirection), 
delta(CurrentDirection, Delta), 
in_cell(OldLoc), 
NewLoc is OldLoc + Delta, 
nth1(NewLoc, Cells, SafetyIdentifier), 
SafetyIdentifier = OK . 

基本上,我想檢查是否一個給定的細胞是「OK」遷入。我錯過了什麼嗎?

+0

NTH1/3 - 從 「1」 計數(不像往常一樣「0」)。這是你的問題嗎? 順便說一句,你試圖統一安全與「確定」移動。這與「檢查」不同。實際的「檢查」可能會出現在其他某個地方,它會嘗試將這種安全與非「OK」統一起來,並且您將進入回溯。 – ony 2010-04-06 04:17:07

+0

我發現無論出於何種原因NewLoc始終是0.是否有這樣的原因?我似乎無法弄清楚? 此外,我不確定我是否理解了答案的後半部分(僅在幾天內編程序)。 – Julio 2010-04-06 04:24:26

回答

2

路易斯,我不完全清楚你想要用這個代碼做什麼,但是可能會有一些幫助。

在Prolog中以大寫字母開頭的內容是要在規則中匹配的變量。 _是一個特殊符號,可以用來代替變量名稱來表示任何值都可以匹配。

next_safe(_)因此只能爲您提供真/假答案,如果您給它一個具體的價值。 Prolog的主要好處之一是能夠通過回溯來統一變量(如ony所說)。這意味着,如果寫得正確,你可以問問Prolog next_safe(X).,它會返回所有可能的與X一致的值(安全移動)。

回到關於大寫字母的第一點。這意味着OK實際上是一個等待匹配的變量。它實際上是一個空盒子,您正嘗試與另一個空盒子進行匹配。我認爲你打算使用的值是ok,這是不同的。您不像使用其他編程風格那樣分配變量。類似以下內容可能會更接近您要查找的內容,但我仍然不確定它是否正確,因爲它看起來像您正在嘗試分配內容,但我不確定您的nth1是如何工作的。

Cells = [ok, _, _, _, _, _] . 

... 

next_safe(NewLoc) :- 
    facing(CurrentDirection), 
    delta(CurrentDirection, Delta), 
    in_cell(OldLoc), 
    NewLoc is OldLoc + Delta, 
    nth1(NewLoc, Cells, ok). 
5

有一個叫nth0 predfined謂詞..

5 ?- nth0(1,[1,2,3],X). 
X = 2. 

6 ?- listing(nth0). 
lists:nth0(A, B, C) :- 
     integer(A), !, 
     A>=0, 
     nth0_det(A, B, C). 
lists:nth0(A, B, C) :- 
     var(A), !, 
     nth_gen(B, C, 0, A). 

true. 

指數列出從0開始 希望這有助於..

相關問題