2014-09-24 4 views
2

나는 프롤로그에 새로운 오전에 목록 길이를 호출하고 다음 링크에서 99 프롤로그 문제를 해결하는 동안 오류가 발생 :프롤로그

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

내가 문제 # 10의 솔루션을 작성했습니다. 내가 [[1,1,1,1,1],[2,2,2],[3,3]]처럼 같은 숫자를 포장하고 길이를 찾을 수 있도록 처음

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)처럼 같은 수의 포장되는 일을 오전과 요구에 따라 다음 그룹을 : 다음은 내 솔루션입니다.

나는 그것이 나에게 다음과 같은 오류를 제공 년대 length 함수를 호출 한 후 encode_list를 호출하고 때 올바르게 유사한 번호를 포장 있지만 :

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

누구든지 저를 도와주십시오! 왜이 오류를주는거야?

+2

내가 실수 길이 함수는 두 개의 인수를 발견 ..... .이 어리석은 실수를해서 미안 해요 ........ 그리고 또 하나의 오류는 작은 글자로 변수 이름 len을 찍었습니다 ...이 두 가지를 수정 한 후에 이것은 잘 작동합니다 .... –

+1

그럼에도 불구하고 , 오류 '[]'이 예상되는 메시지는 꽤 오도 된 것입니다. – false

+0

예 .... 그래서 나는 오류를 찾을 수 없습니다 ... 그래서 여기에 게시 .... –

답변

2

을 바탕으로 splitlistIfAdj/3dif/3maplist/3, Prolog lambdaslength/2, 우리는 쓰기 :

:- use_module(library(lambda)). 

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

샘플 쿼리 :

?- encode([a,a,a,a,b,c,c,a,a,d,e,e,e,e],Xs). 
Xs = [[4,a],[1,b],[2,c],[2,a],[1,d],[4,e]]. % succeeds deterministically