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

Trying to generate list of non-zero integers in Prolog

我正在尝试在 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. 第一步:在你的程序中加入约束。为此,只需 1(is)/2 替换为 CLP(FD) 约束 (#=)/2,即:

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

    ?- int(X).
    X in -1\/1 ;
    X in -2\/2 ;
    X in -3\/3 ;
    X in -4\/4 .
    

    因此,从上面可以看出,您所描述的不足以获得基本解决方案:您的关系中仍有一定程度的自由度。

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

    int(X) :- positives(Y), ( X #= Y ; X #= -Y).
    
  4. 第四步:我们试试看:

    ?- int(X).
    X = 1 ;
    X = -1 ;
    X = 2 ;
    X = -2 ;
    X = 3 ;
    etc.
    

似乎可行OK,除了 自然数 实际上从来都不是负数。我将解决问题标题与您描述的关系之间的差异作为您的练习。

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


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