prolog中的谓词编码

时间:2016-08-03 09:25:57

标签: encoding prolog

我是prolog中的新手,我正在尝试编写谓词encode(L,L1),它会计算L中元素的重复项,例如:

encode([4,4,4,3,3],L).

L=[3,4,2,3].

这就是我写的:

encode(L,L1) :- encode(L,1,L1).

encode([],_,[]).      
encode([H],N,[N,H]).      
encode([H,H|T],N1,[N,H|T1]) :- M is N1+1, encode([H|T],M,[N,H|T1]).     
encode([H,Y|T],N,[N,H|T1]) :- H\=Y, encode([Y|T],T1).   

上述谓词不可逆转。它仅在提供第一个参数时有效。

如何编写可逆的编码?
例如:

encode(L,[3,4,2,3]).           
L = [4,4,4,3,3].

1 个答案:

答案 0 :(得分:4)

我认为你的算法中有一个冗余计数器。稍微简化一下:

encoded([], []).
encoded([X], [1,X]).
encoded([X,Y|T], [1,X|R]) :-
    dif(X, Y),
    encoded([Y|T], R).
encoded([X,X|T], [N,X|R]) :-
    N #> 1,
    N #= N1 + 1,
    encoded([X|T], [N1,X|R]).

请注意,在最后一句中,我们需要确保N也大于1。