2013-05-06 37 views
0

我有一个prolog中的一个小规则,它必须检查一个元素是否是列表的成员,并将它写入列表中的位置,但它只在我要找的elemebt在1个地方。需要帮助!序言元素是一个列表成员检查

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

回答

1

这个东西究竟应该被称为什么?看来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. 

希望这有助于!

1

既然你汇报它的工作只为第一的位置,这里是简单的修正可能你的代码,使其在其他情况下工作:

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

但是从丹尼尔的回答(+1)是什么你应该学习。

+1

我总是印象深刻的方式,你可以从模糊的问题恢复意图。 +1 – 2013-05-07 05:25:07

相关问题