尝试在Prolog中生成非零整数列表

尝试在Prolog中生成非零整数列表,prolog,clpfd,instantiation-error,Prolog,Clpfd,Instantiation Error,我试图在prolog中定义函数int(?X),它是一个非零整数生成器,工作原理如下: ?- int(X). X = 1 ; X = -1 ; X = 2 ; X = -2 ; 我尝试了以下方法,但没有成功: int(X):- positives(Y), Y is abs(X). positives(1). positives(X):- positives(Y), X is Y+1. 但我得到了以下错误: ERROR: is/2: Arguments are not sufficiently

我试图在prolog中定义函数
int(?X)
,它是一个非零整数生成器,工作原理如下:

?- int(X). X = 1 ; X = -1 ; X = 2 ; X = -2 ;
我尝试了以下方法,但没有成功:

int(X):- positives(Y), Y is abs(X).

positives(1).
positives(X):- positives(Y), X is Y+1.
但我得到了以下错误:

ERROR: is/2: Arguments are not sufficiently instantiated

我怎样才能做到这一点?谢谢

有一种简单的方法来发现和纠正这些问题

  • 第一步:在程序中设置约束。为此,只需1用CLP(FD)约束替换
    (#=)/2
    ,即:

    int(X) :- positives(Y), Y #= abs(X).
    
    positives(1).
    positives(X):- positives(Y), X #= Y+1.
    
  • 第二步:查询现在完成,没有错误,并显示您正在描述的内容:

    ?- int(X).
    X in -1\/1 ;
    X in -2\/2 ;
    X in -3\/3 ;
    X in -4\/4 .
    
    因此,从上面可以看出,你所描述的不足以获得基本的解决方案:在你们的关系中仍然有一定程度的自由

  • 第三步:要真正解决问题,我们需要考虑我们想要描述的内容。这是一个开始:

    int(X) :- positives(Y), ( X #= Y ; X #= -Y).
    
  • 第四步:我们尝试一下:

    ?- int(X).
    X = 1 ;
    X = -1 ;
    X = 2 ;
    X = -2 ;
    X = 3 ;
    etc.
    
  • 似乎有效OK,除了自然数实际上从不为负这一事实。我留下来修正你问题的标题和你描述的关系之间的差异,这对你来说是一个练习

    TL;DR:当对整数进行推理时,使用系统的CLP(FD)约束,然后从那里获取它



    我假设您已经在初始文件的某个地方放置了
    :-use_module(library(clpfd))。
    ,以便您可以在所有程序中使用CLP(FD)约束

    这是一个很好的解决方案,但我需要一个不使用clpfd或任何其他库的解决方案。没有必要使用我的代码并尝试修复它。我可以接受一个与我所写的完全不同的解决方案。为了满足对1970年风格解决方案的需求,您只需反向执行步骤1:将
    (#=)/2
    替换为我们找到的解决方案中的
    (is)/2
    ,瞧,这个荒谬的要求得到了满足!请保留与解决问题相关的标签。这些标签旨在帮助其他读者找到与他们正在寻找的主题相关的答案,而不是反映讲师的非感官要求!我已经恢复了标签,因为使用CLP(FD)约束可以消除这个问题,这是您的问题和stackoverflow的许多其他问题的核心问题。这是因为讲师现在仍然像30年前那样教授Prolog,随着时间的推移,这些问题将通过向他们指出声明性解决方案来解决。