我不确定该程序将如何以L2
结束encode(L1,L2) :-
pack(L1,L),
transform(L,L2).
L2= [[2, a], [3, b], [2, c]]
L1=[a,a,b,b,b,c,c].
using pack I would get
L=[[a,a],[b,b,b],[c,c]].
%1.rule:
transform([],[]).
%2.rule:
transform([[X|Xs]|Ys],[[N,X]|Zs]) :-
length([X|Xs],N),
transform(Ys,Zs).
所以假设程序会像这样。
它将首先检查不正确的第一条规则并转到第二条规则。
transform([[a|[a]]|[[b,b,b],[c,c]]],[[N|a]|Zs]) :-
length([a|[a]],2), transform([[b,b,b],[c,c]],Zs).
transform([[b|[b,b]]|[c,c],[[2|b]|Zs]) :-
length([b|[b,b]],3), transform([c,c],Zs).
transform([[c|[c]]|[]],[[3|b]|Zs]) :-
length([c|[c]],3), transform([],Zs).
然后我真的不知道程序是如何进行的,我试图理解它启用Prolog的跟踪功能,但我仍然无法掌握它。