我正尝试在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]。
答案 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])