Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 从列表中删除两个连续常量_Prolog - Fatal编程技术网

Prolog 从列表中删除两个连续常量

Prolog 从列表中删除两个连续常量,prolog,Prolog,我有一个列表,我应该删除列表中连续的重复项 例如: compress([a,a,b,c,c,d,d,d,e], New_List) New_List = [a,b,c,d,e]. 我已经写了一些代码,但当我尝试时,我收到了false,并且不明白为什么(我对prolog有点生疏) 编辑1 我现在在写代码时注意到,使用此代码,最后一个字母永远不会追加。您可以创建一个helper谓词,该谓词将删除列表中的元素,直到它找到下一个不同的元素,或者到达列表的末尾: dropEq([], _, []).

我有一个列表,我应该删除列表中连续的重复项

例如:

compress([a,a,b,c,c,d,d,d,e], New_List) 
New_List = [a,b,c,d,e].
我已经写了一些代码,但当我尝试时,我收到了false,并且不明白为什么(我对prolog有点生疏)

编辑1


我现在在写代码时注意到,使用此代码,最后一个字母永远不会追加。

您可以创建一个helper谓词,该谓词将删除列表中的元素,直到它找到下一个不同的元素,或者到达列表的末尾:

dropEq([], _, []).
dropEq([H|T], X, [H|T]) :-
    dif(H, X).
dropEq([H|T], H, R) :-
    dropEq(T, H, R).
compress([], []).
compress([H|T], [H|R]) :-
    dropEq(T, H, Q),
    compress(Q, R).
接下来,我们可以使用它来压缩列表:

dropEq([], _, []).
dropEq([H|T], X, [H|T]) :-
    dif(H, X).
dropEq([H|T], H, R) :-
    dropEq(T, H, R).
compress([], []).
compress([H|T], [H|R]) :-
    dropEq(T, H, Q),
    compress(Q, R).
压缩([],[])。 压缩([H|T],[H|R]):- dropEq(T,H,Q),
压缩(Q,R)。您可以创建一个帮助器谓词,用于删除列表中的元素,直到找到下一个不同的元素,或到达列表的末尾:

dropEq([], _, []).
dropEq([H|T], X, [H|T]) :-
    dif(H, X).
dropEq([H|T], H, R) :-
    dropEq(T, H, R).
compress([], []).
compress([H|T], [H|R]) :-
    dropEq(T, H, Q),
    compress(Q, R).
接下来,我们可以使用它来压缩列表:

dropEq([], _, []).
dropEq([H|T], X, [H|T]) :-
    dif(H, X).
dropEq([H|T], H, R) :-
    dropEq(T, H, R).
compress([], []).
compress([H|T], [H|R]) :-
    dropEq(T, H, Q),
    compress(Q, R).
压缩([],[])。 压缩([H|T],[H|R]):- dropEq(T,H,Q),
压缩(Q,R)。这不是一个谓词,而是一个常量。对不起,我的谷歌翻译不好。
追加([Head],New_List)
没有多大意义
append/3
将两个列表附加在一起需要三个参数。嗯,您是对的,但是要在列表中插入元素,我只能使用append吗?因为我曾经考虑过一次添加一个项目。不,你也可以在谓词的开头使用统一。这不是谓词,而是常量。对不起,我的谷歌翻译不好。
append([head],New_List)
没有多大意义
append/3
将两个列表附加在一起需要三个参数。嗯,您是对的,但是要在列表中插入元素,我只能使用append吗?因为我曾考虑过一次添加一项否,您也可以在谓词的开头使用统一。@Jack23:
dif(H,X)
确保值不同。如果这两个变量都是变量,它会添加一个差异约束,这样,如果以后当变量固定时,如果变量最终是相同的,它将失败。@Jack23:prepending发生在
[H |…]
部分的
[H | R]
部分,在
compress/2
@Jack23:
dif(H,X)的第二个子句中
确保值不同。如果这两个变量是变量,它会添加一个差异约束,这样,如果以后变量固定,如果变量最终是相同的,它将失败。@Jack23:compress/2的第二个子句中的
[H |…]
部分中的
[H | R]