我的列表开头有一个未知的零,例如[0,0,0,1,2,2,0,3]。我需要将此列表除去前导零,以便看起来像[1、2、0、3]。

这是我所拥有的:

lead([Head | _], _) :- Head =\= 0.
lead([0 | Tail], _) :-
  lead(Tail, Tail).


其输出只是True。读取跟踪表明它正在运行,直到它有一个没有前导零的列表为止,但是答案并没有传播回堆栈。我对Prolog还是很陌生,所以我不知道如何使它做到这一点。

最佳答案

这是一个全方位解决方案:

lead([],[]).
lead([H|T],[H|T]) :-
    dif(H,0).
lead([0|T],T2) :-
    lead(T,T2).


一些查询:

?- lead([0,0,0,1,2,0,3], L).
L = [1, 2, 0, 3] ;
false.


?- lead(L, []).
L = [] ;
L = [0] ;
L = [0, 0] ;
L = [0, 0, 0] ;
...


?- lead(L0, L).
L0 = L, L = [] ;
L0 = L, L = [_G489|_G490],
dif(_G489, 0) ;
L0 = [0],
L = [] ;
L0 = [0, _G495|_G496],
L = [_G495|_G496],
dif(_G495, 0) ;
L0 = [0, 0],
L = [] ;
L0 = [0, 0, _G501|_G502],
L = [_G501|_G502],
dif(_G501, 0) ;
L0 = [0, 0, 0],
L = [] ;
...


编辑此谓词实际上不适用于例如lead(L0, [0,1,2])

关于list - 删除Prolog列表中的前导零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39799115/

10-13 23:14