【发布时间】:2017-01-29 09:32:07
【问题描述】:
我正在尝试实现一个谓词indices_zero(L,R),它应该在一个列表中找到所有零位置并在一个新列表中输出索引。
我正在尝试用蓄电池来做到这一点。
例如:
?-indices_zero([1,-2,3,0,5,0],R).
R=[4,6];
我已经实现了以下:
indices_zero(Ls,R):-
indices_zero(Ls,1,[],Result).
indices_zero([L|Ls],N,R,Result):-
L=:=0,
N1 is N+1,
indices-zero(Ls,N1,[N|R],Result).
indices_zero([L|Ls],N,R,Result):-
L=\=0,
N1 is N+1,
indices_zero(Ls,N1,R,Result).
indizes_zero([],_,Result,Result).
我不确定为什么我的实现不起作用。我想我的口渴条款 不正确,但我不知道如何解决。
【问题讨论】:
-
你试过使用调试器吗?它也是
indices_zero而不是indices-zero。注意_与-。另外,indices_zero(Ls,R):-indices_zero(Ls,1,[],Result).注意一个是R,另一个是Result。 -
您的列表中有很多错别字或错误。在第一个子句中,您有一个参数
R,但在正文中使用了Result。两者都将被引用为单身人士。您的最后一个子句拼写为indizes_zero,而不是indices_zero。您的第二个子句调用indices-zero而不是indices_zero。 -
我真是个白痴:-(简直不敢相信!!谢谢,谢谢所有的答案!!从几个小时开始就一直在寻找解决方案,但从来没有看过我的打字错误。
-
跟踪错误和警告消息是一个很好的做法。您的
R与Result问题会产生有关“单例变量”的警告,这意味着您有一个仅出现一次的变量(因此,似乎没有任何目的)。执行代码时,您可能会看到indices-zero未定义的错误,这会导致您找到拼写错误。 -
您可能会喜欢:
indices_zero(L,R) :- findall(I, nth1(I,L,0), R).仅此而已