簡體   English   中英

Prolog元素是列表成員檢查

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM