[英]Prolog element is a list member check
我在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)的回答是你應該學習的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.