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

Fat*_*ize 5 prolog infinite-loop clpfd failure-slice

假设我想表示这样的整数: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).
Run Code Online (Sandbox Code Playgroud)

这按预期工作.然而,它具有接受诸如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).
Run Code Online (Sandbox Code Playgroud)

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

integer_value(integer:negative:[1,9],Z).返回Z = 19然后返回false 的"反向"查询不会发生此问题,当两个参数都是变量时它也不会发生(它正确地枚举数字,没有前导零),这对我来说是令人惊讶的.

知道无限循环发生了什么,如果有一个简单的方法来解决它?

fal*_*lse 5

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

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这是第一次出现在这里,所以任何长度都是可能的.你必须以某种方式修改长度目标.

  • @Fatalize:有关相关问题,请参阅[this](http://stackoverflow.com/a/28442760/772868). (2认同)