gpt4 book ai didi

prolog - Prolog CLPFD 中的整数列表和无限循环

转载 作者:行者123 更新时间:2023-12-02 04:34:47 26 4
gpt4 key购买 nike

假设我想像这样表示整数:integer:Sign:[FirstDigit,SecondDigit,...] 。例如,42 将表示为 integer:positive:[4,2] .

我需要一个谓词来根据此表示生成整数值,反之亦然。

这是我的想法:

integer_value_('integer':Sign:[H],E) :-
H in 0..9,
(
Sign = 'positive',
E #= H
;
Sign = 'negative',
E #= -H
).
integer_value_('integer':Sign:[H,I|T],E) :-
H in 0..9,
length([I|T],L),
(
Sign = 'positive',
E #= F + H * 10^L
;
Sign = 'negative',
E #= F - H * 10^L
),
integer_value_('integer':Sign:[I|T],F).

这按预期工作。然而,它有一个不幸的特性,即接受像 integer:positive:[0,1] 这样的东西。 ,即列表开头的前导零。当我使用 integer_value_(I,J), label([J]). 枚举所有可能的整数时,这尤其成问题。 :带有前导零的也会显示。

然后我尝试使用 integer_value_ 来纠正此问题仅适用于除第一个数字之外的所有数字,并使用 integer_value对于第一个(请记住,我们需要用仅包含 0 的列表来表示 0):

integer_value('integer':Sign:[H],E) :-
abs(E) #< 10,
abs(E) #> -1,
integer_value_('integer':Sign:[H],E).
integer_value('integer':Sign:[H,I|T],E) :-
H in 1..9,
length([I|T],L),
(
Sign = 'positive',
E #= F + H * 10^L
;
Sign = 'negative',
E #= F - H * 10^L
),
integer_value_('integer':Sign:[I|T],F).

但是现在它的行为不正常。例如,integer_value(I,-19).返回I = integer:negative:[1, 9] ,但是如果我们要求另一个答案,Prolog 会因为我不明白的原因进入无限循环(它应该说 false,或者已经知道没有其他答案)。

“相反”查询 integer_value(integer:negative:[1,9],Z). 不会出现此问题返回 Z = 19然后为 false,当两个参数都是变量时也不会发生(它正确枚举数字,没有前导零),这让我感到惊讶。

知道无限循环发生的原因吗?是否有简单的方法来修复它?

最佳答案

要发现问题,只需查看程序的一小部分就足够了。事实上以下就足够了:

integer_value('integer':Sign:[H],E) :- false,    abs(E) #< 10,    abs(E) #> -1,    integer_value_('integer':Sign:[H],E).integer_value('integer':Sign:[H,I|T],E) :-    H in 1..9,    length([I|T],L), false,    (   Sign = 'positive',        E #= F + H * 10^L        ;        Sign = 'negative',        E #= F - H * 10^L    ),    integer_value_('integer':Sign:[I|T],F).

L 第一次出现在这里,所以任何长度都是可能的。您必须以某种方式修改长度目标。

关于prolog - Prolog CLPFD 中的整数列表和无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36776702/

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