在Prolog中调用列表中的长度时获取错误

时间:2014-09-24 20:45:04

标签: prolog

我是Prolog的新手并通过以下链接解决了99个Prolog问题:

http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/

我写了一个问题#10的解决方案。以下是我的解决方案:

encode(L,Ans) :-
   pack(L,Res),
   encode_list(Res,Ans).

encode_list([],[]).
encode_list([[X|Xs]|Zs],[[len,X]|Ans]) :- 
   len is length([X|Xs]),
   encode_list(Zs,Ans).

pack([],[]).
pack([X|Xs],[Y|Ys]) :-
   transfer(X,Xs,Zs,Y),
   pack(Zs,Ys).

transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Zs],[X]) :-
   X =\= Y,
   transfer(X,Ys,Zs,[X]).
transfer(X,[X|Xs],Ys,[X|Zs]) :- 
   transfer(X,Xs,Ys,Zs).

我正在做的是首先打包相同的数字,如假设encode([1,1,1,1,1,2,2,2,3,3],X)被调用,所以首先我打包相同的数字,如[[1,1,1,1,1],[2,2,2],[3,3]],然后查找其长度,然后根据要求对它们进行分组。 / p>

正在打包相似的号码,但是当我拨打encode_list然后拨打length功能时,它会给我以下错误:

ERROR: is/2: Type error: `[]' expected, found `[1,1,1]' ("x" must hold one character)

任何人都请帮助我!为什么会出现这个错误?

1 个答案:

答案 0 :(得分:2)

基于splitlistIfAdj/3dif/3maplist/3Prolog lambdaslength/2,我们写道:

includes()

示例查询:

:- use_module(library(lambda)).

encode(Ls,Xs) :-
   splitlistIfAdj(dif,Ls,Rs),
   maplist(\[E|Es]^[N,E]^length([E|Es],N),Rs,Xs).