2

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

?- 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

我怎样才能使这项工作?谢谢!

4

1 回答 1

4

有一种简单的方法可以找到并纠正此类问题。

  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.
    

似乎工作正常,除了自然数实际上永远不会是负数的事实。我将解决您的问题标题与您描述为您的练习的关系之间的这种差异。

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


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

于 2016-06-29T22:30:40.617 回答