gpt4 book ai didi

list - 消除连续的重复

转载 作者:行者123 更新时间:2023-12-01 08:52:50 25 4
gpt4 key购买 nike

消除列表元素的连续重复。

我的解决方案是:

compress([X,X|Xs], Q) :-
compress([X|Xs], Q).
compress([X,Y|Xs], Q) :-
X \= Y,
compress([Y|Xs], QR),
append([X], QR, Q).
compress([X|[]], Q) :-
compress([], QR),
append([X], QR, Q).
compress([], []).

而且,由于我是初学者而且我没有逻辑范式方面的经验,所以我请你说出我可以改进的地方以及为什么我的解决方案不能做到最好。

例如,X\= Y 在我看来并不漂亮。

最佳答案

我们从谓词的名称开始。

为什么您使用命令表示关系?一个良好的序言程序可在所有方向中使用,而当务之急始终建议使用特定的方向或使用方式。因此,选择一个声明名称并瞄准通用性和

接下来,最一般的查询呢:

?- compress(Ls, Cs).
ERROR: Out of local stack

不是很好!我们希望这至少会产生一些答案。

如果我们使用迭代深化会怎样:

?- length(Ls, _), compress(Ls, Cs).Ls = Cs, Cs = [] ;Ls = Cs, Cs = [_G841] ;Ls = [_G841, _G841],Cs = [_G841] ;Ls = [_G841, _G841, _G841],Cs = [_G841] .

嗯!很多答案都不见了!元素是不同的情况如何? As you already intuitively expect, it is the use of impure predicates that leads to such effects.

Therefore, use , i.e., dif/2, to denote that two terms are different.它可以在各个方向使用!

Moreover, DCGs ( ) are often useful when describing lists.

所以,总的来说,这个怎么样:

compression([])     --> [].compression([L|Ls]) --> [L], compression_(Ls, L).compression_([], _) --> [].compression_([X|Xs], L) -->        (   { X = L },            compression_(Xs, L)        ;   { dif(X, L) },            [X],            compression_(Xs, X)        ).

We use the interface predicate phrase/2 to work with the DCG.

用法示例:

?- phrase(compression(Ls), Cs).Ls = Cs, Cs = [] ;Ls = Cs, Cs = [_G815] ;Ls = [_G815, _G815],Cs = [_G815] .?- length(Ls, _), phrase(compression(Ls), Cs).Ls = Cs, Cs = [] ;Ls = Cs, Cs = [_G865] ;Ls = [_G865, _G865],Cs = [_G865] ;Ls = Cs, Cs = [_G1111, _G1114],dif(_G1114, _G1111) .

从这里拿走! Improve determinism, find an even better name etc.

关于list - 消除连续的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37376137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com