在Prolog中折叠成对的重复项

时间:2018-11-30 01:26:25

标签: prolog

我正尝试在Prolog中编写一个程序,以在重复项彼此相邻时折叠重复项。

这里有一些例子,

[1,2,2,3,4]-> [1,2,3,4]

[1,2,2,2,3,4]-> [1,2,2,3,4]

我试图做的事情看起来像这样...

 Look at the 3 elements in the front, 
    if they are equal,
    collapse them into 2, 
    set head to 3rd element.

 Look at 2 elements in front,
    if they are equal,
    collapse them into 1, 
    set head to 2nd element. 

Look at 2 elements in front,
   if they are not equal,
   do nothing,
   set head to 2nd element.

我认为这种逻辑应该起作用,但是我对Prolog还是陌生的,不知道如何写。

这就是我所拥有的

unecho([X],[X]).
unecho([X,Y,Z|XS],YS) :-
X=Y,
    Y=Z,
    unecho([Z|XS],YS).
unecho([X,Y|XS],YS):-
    X = Y,
    unecho([X|XS],YS).
unecho([X,Y|XS],[X|YS]):-
    X \= Y,
    unecho([Y|XS],YS).

当我的输入为unecho([1,2,2,2,3,4],X)时,我的输出为X = [1,2,3,4],应为[1,2,2, 3,4]。

1 个答案:

答案 0 :(得分:0)

您不需要规则unecho([X,Y,Z|XS],YS),因为您只需查看X中的前两项Y[X,Y|Xs]:在任何情况下,{{1} }成为第二个列表的头(并且您将永远不会在递归调用中再次扫描它);如果X等于X,那么您就忘了Y,否则Y会在递归调用中放在前面:

Y

,您还需要一个谓词作为空列表:

 unecho([X,Y|XS],[X|YS]):-
     X = Y,
     unecho(XS,YS).
 unecho([X,Y|XS],[X|YS]):-
     X \= Y,
     unecho([Y|XS],YS).

否则 unecho([],[]). unecho([X],[X]). 将失败。

一些测试:

unecho([1,1],[1])