Prolog元素是列表成员检查

时间:2013-05-06 22:25:44

标签: list prolog member

我在prolog中有一个小规则,必须检查一个元素是否是列表的成员并在列表中写下它的位置,但它只有在我正在寻找的元素位于1个位置时才有效。请帮助!

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

2 个答案:

答案 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)的回答是你应该学习的。