2013-05-06 36 views
0

我有一個prolog中的一個小規則,它必須檢查一個元素是否是列表的成員,並將它寫入列表中的位置,但它只在我要找的elemebt在1個地方。需要幫助!序言元素是一個列表成員檢查

write_element(X,[X|_],1). 
write_element(X,[_|Tail],N):- 
N1 is N-1, 
write_element(X,Tail,N1). 

回答

1

這個東西究竟應該被稱爲什麼?看來N將不得不由我來實例化,否則N1 is N-1將無法​​工作。但類似地,N在你的基本情況下必須與1一致,所以如果列表中存在X,則N必須等於1。所以我認爲你在圍繞如何調用這個方面有一些基本的困惑。如果你想用N作爲計數器,你可能不能將它用作變量。儘管如此,你應該重新考慮你對減量的思考,因爲我沒有看到任何理由期望它被一個適合遞減的大值所調用,除非你的代碼中有其他地方沒有共享的length/2

你的第二個問題是,這不會寫任何地方,因爲你沒有包括實際的問題陳述,我將不得不猜測,你可能實際上想要做的只是返回位置,就像nth1/3。我們可以使用nth1/3來實現這一點,如果你只是想打印出來的位置,如果該元素存在:

write_element(X, L, N) :- nth1(N, L, X), write(N). 

賠率是好的,這不是什麼打算。如果你想實現像nth1/3這樣的事情會更有趣一些,因爲我們需要將我們從我們使用的櫃檯返回的櫃檯分開。所以它會看起來像這樣:

write_element(X,L,N) :- write_element_loop(X,L,1,N). 

write_element_loop(X, [X|_] , N, N). 
write_element_loop(X, [_|Xs], N0, N) :- 
    N1 is N0+1, 
    write_element_loop(X, Xs, N1, N). 

這實際上是非常接近你的代碼,我只是明確計數器和返回值之間的區別。如果您想要打印的值,而不是僅僅統一它們,你可以添加到第一統治的結束:

write_element_loop(X,[X|_],N,N) :- write(N), nl. 

希望這有助於!

1

既然你彙報它的工作只爲第一的位置,這裏是簡單的修正可能你的代碼,使其在其他情況下工作:

write_element(X,[X|_],1). 
write_element(X,[_|Tail],N):- 
    write_element(X,Tail,N1), 
    N is N1 + 1. 

但是從丹尼爾的回答(+1)是什麼你應該學習。

+1

我總是印象深刻的方式,你可以從模糊的問題恢復意圖。 +1 – 2013-05-07 05:25:07

相關問題