gpt4 book ai didi

Prolog的数字检查表是有序的

转载 作者:行者123 更新时间:2023-12-01 12:48:58 26 4
gpt4 key购买 nike

我希望能够获取一个数字列表并获得最大的有序数字序列。例如:

?- in_order([1,2,3,4,5],N).
N = 5. % expected result

?- in_order([1,2,5,6,7,8,4],N).
N = 4. % expected result

到目前为止,我已经生成了一些计算数字序列长度的基本代码,但是一旦列表为空,它就会回溯,因此返回的数字 N 与列表中的第一个元素相同。我知道我需要停止回溯,但似乎做不到。有人会友善地指出我正确的方向吗?

到目前为止我的代码(可能有点乱):

in_order([],_) :-
!.
in_order([H|T],N):-
( var(N),
N is H
; true
),
H = N,
M is N+1,
in_order(T,M).

我确实知道我当前的解决方案在给出的第二个示例中不起作用,并且针对该方面的指示将再次有所帮助,因为我不太确定如何解决该方面。我正在使用 SICStus Prolog。

非常感谢!

最佳答案

让我称该关系为 zs_maxInOrder/2,它基于 clpfd并使用 reified constraints :

:- use_module(library(clpfd)).

zs_maxInOrder([] ,0).
zs_maxInOrder([Z|Zs],N) :-
zs_prev_n_max0_max(Zs,Z,1,1,N). % use "lagging"

zs_prev_n_max0_max([] ,_ ,_ ,M ,M).
zs_prev_n_max0_max([Z1|Zs],Z0,N0,M0,M) :-
Z1 #= Z0 + 1 #<=> B, % with SWI-Prolog use `(#<==>)/2`
N1 #= N0 * B + 1,
M1 #= max(M0,N1),
zs_prev_n_max0_max(Zs,Z1,N1,M1,M).

让我们使用 SICStus Prolog 4.3.1 看看它的实际效果:

?- zs_maxInOrder([1,2,3,4,5],N).N = 5 ? ;no?- zs_maxInOrder([1,2,5,6,7,8,4],N).N = 4 ? ;no

What about corner cases?

?- zs_maxInOrder([1],N).
N = 1 ? ;
no
?- zs_maxInOrder([],N).
N = 0 ? ;
no

关于Prolog的数字检查表是有序的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707665/

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