List Prolog合并列表中的两个元素

List Prolog合并列表中的两个元素,list,prolog,List,Prolog,我必须合并列表中两个相等的元素,如下所示: [1,2,3,4,5,5,6,7,5,6] => [1,2,3,4,55,6,7,5,6] 如何在prolog中执行此操作?谢谢大家。诸如此类的事 my_merge(N, L, R) :- merge(N, L, [], R). merge(_, [], R, R1) :- reverse(R, R1). merge(N, [M | T], CR, FR) :- N \= M, merge(N, T, [M

我必须合并列表中两个相等的元素,如下所示:

[1,2,3,4,5,5,6,7,5,6] => [1,2,3,4,55,6,7,5,6]
如何在prolog中执行此操作?谢谢大家。

诸如此类的事

my_merge(N, L, R) :-
    merge(N, L, [], R).

merge(_, [], R, R1) :-
    reverse(R, R1).


merge(N, [M | T], CR, FR) :-
    N \= M,
    merge(N, T, [M |CR], FR).


merge(N, [N | T], CR, FR) :-
    merge_(N, T, N, CR, FR).


merge_(N, [M| T], X, CR, FR) :-
    M \= N,
    merge(N, [M | T], [X | CR], FR).


merge_(N, [N| T], X, CR, FR) :-
    X1 is X * 10 + N,
    merge_(N, T, X1, CR, FR).


merge_(_N, [], X, CR, FR) :-
    reverse([X | CR], FR).

滥用Prolog灵活的数据表示法,我们可以这样做:

fuse_consec([E,E|L], E, [N|F]) :-
    !, fuse_consec([E|L], E, [R|F]),
    atom_concat(E, R, C),
    atom_number(C, N).
fuse_consec([X|L], E, [X|F]) :-
    fuse_consec(L, E, F).
fuse_consec([], _, []).
试验


您对
[1,5,5,7]
有什么期望?您希望升序值吗?注意:我想选择数字。。。示例我想要合并5,那么[1,2,2,3,4,5,5,6]->[1,2,2,3,4,55,6]
atom_concat/3
应该为第一个参数为整数产生错误。只有SWI的处理方式不同。您的版本不是尾部递归的,但仍然使用剪切。@false:剪切似乎是避免后续复制规则所必需的,我更喜欢在这里使用它,而不是if/then/else,这样就不那么冗长了。什么是atom_concat的ISO便携替代品?最初,我也避免使用atom_编号,获得atom(如果元素是数字,问题中没有明确说明,只是在注释中)可能你没有听到我的第一条注释:这个程序不是ISO和SWI/YAP特定的。
my_merge(5,[5,5,5,5],R)。
失败。+1,如果有人想获得精确的历史记录,最好删除编辑内容,他们无论如何都可以看。
?- fuse_consec([1,2,3,4,5,5,6,7,5,6],5,L).
L = [1, 2, 3, 4, 55, 6, 7, 5, 6].