我在prolog中有一个小规则,必须检查一个元素是否是列表的成员并在列表中写下它的位置,但它只有在我正在寻找的元素位于1个位置时才有效。请帮助!
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
N1 is N-1,
write_element(X,Tail,N1).
答案 0 :(得分:1)
这件事应该怎么称呼?似乎N必须由我实例化,否则N1 is N-1
将无效。但同样地,N必须在基本情况下与1统一,因此如果列表中存在X,则N必须等于1。所以我认为你有一些基本的混淆,围绕如何调用它。如果你想使用N作为计数器,你可能也不能将它用作变量。你应该重新审视你对减量的想法,因为我没有看到任何理由期望用一个适合递减的大值来调用它,除非你的代码中有一个你没有共享的length/2
。
你的第二个问题是,它不会在任何地方写任何东西,因为你没有包含实际的问题陈述,我将不得不猜测你可能真正想做的就是返回位置,如{ {1}}。如果您只是想在元素存在时打印出位置,我们可以使用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).
希望这有帮助!
答案 1 :(得分:1)
由于您报告它仅适用于第一个位置,因此可以对代码进行更简单的更正,使其在其他情况下起作用:
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
write_element(X,Tail,N1),
N is N1 + 1.
但丹尼尔(+1)的回答是你应该学习的。