prolog - 在 Prolog 中调用列表上的 length 时出现错误

标签 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]] 然后找到它的长度然后分组按要求进行。

它正确地打包了相似的数字,但是当我调用 encode_list 然后调用 length 函数时,它给了我以下错误:

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

请大家帮帮我!为什么会出现这个错误?

最佳答案

基于splitlistIfAdj/3 , dif/3 , maplist/3 , Prolog lambdas ,和length/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

关于prolog - 在 Prolog 中调用列表上的 length 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026134/

相关文章:

prolog - 使用 in_set/2 约束

Prolog:创建子列表,给定两个索引

prolog - 关于混合 Prolog 协程(freeze/2,when/2)和 DCG

Prolog 程序返回命题公式中的原子

html - 如何在 SWI-Prolog 中处理 POST 请求?

Prolog中的列表移位

scala - 你能用 Scala 进行逻辑编程吗?

使用列表的 Prolog 到 Datalog 代码转换

Prolog,在终端中得到正确的答案,但在运行程序时得到错误的答案

prolog - 如何找到排列索引