【问题标题】:Prolog find indices in a list and output them as a listProlog 在列表中查找索引并将它们作为列表输出
【发布时间】: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
  • 我真是个白痴:-(简直不敢相信!!谢谢,谢谢所有的答案!!从几个小时开始就一直在寻找解决方案,但从来没有看过我的打字错误。
  • 跟踪错误和警告消息是一个很好的做法。您的 RResult 问题会产生有关“单例变量”的警告,这意味着您有一个仅出现一次的变量(因此,似乎没有任何目的)。执行代码时,您可能会看到 indices-zero 未定义的错误,这会导致您找到拼写错误。
  • 您可能会喜欢:indices_zero(L,R) :- findall(I, nth1(I,L,0), R). 仅此而已

标签: list prolog


【解决方案1】:

试试这个。

indices_zero(Ls, R) :-
    indices_zero(Ls, 1, [], R).

indices_zero([], _, Result, Result).

indices_zero([0|T], N, Result_in, Result_out) :-
    N1 is N + 1,
    indices_zero(T, N1, [N|Result_in], Result_out).

indices_zero([H|T], N, Result_in, Result_out) :-
    H \== 0,
    N1 is N + 1,
    indices_zero(T, N1, Result_in, Result_out).

?- indices_zero([1,-2,3,0,5,0],R).
R = [6, 4] ;
false.

这是一个在回溯时构建结果的变体。
请注意答案中的索引顺序现在是升序。

indices_zero(Ls,R) :-
    indices_zero(Ls,1,R).

indices_zero([],_,[]).

indices_zero([0|T], N, [N|Result]) :-
    N1 is N + 1,
    indices_zero(T, N1, Result).

indices_zero([H|T], N, Result) :-
    H \== 0,
    N1 is N + 1,
    indices_zero(T, N1, Result).

?- indices_zero([1,-2,3,0,5,0],R).
R = [4, 6] ;
false.

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2023-02-11
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多