我有一個prolog中的一個小規則,它必須檢查一個元素是否是列表的成員,並將它寫入列表中的位置,但它只在我要找的elemebt在1個地方。需要幫助!序言元素是一個列表成員檢查
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
N1 is N-1,
write_element(X,Tail,N1).
我有一個prolog中的一個小規則,它必須檢查一個元素是否是列表的成員,並將它寫入列表中的位置,但它只在我要找的elemebt在1個地方。需要幫助!序言元素是一個列表成員檢查
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
N1 is N-1,
write_element(X,Tail,N1).
這個東西究竟應該被稱爲什麼?看來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.
希望這有助於!
既然你彙報它的工作只爲第一的位置,這裏是簡單的修正可能你的代碼,使其在其他情況下工作:
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
write_element(X,Tail,N1),
N is N1 + 1.
但是從丹尼爾的回答(+1)是什麼你應該學習。
我總是印象深刻的方式,你可以從模糊的問題恢復意圖。 +1 – 2013-05-07 05:25:07