尝试在 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
我怎样才能完成这项工作?谢谢!
有一种简单的方法可以找到并纠正此类问题。
第一步:在你的程序中加入clpfd约束。为此,只需 1 将 (is)/2
替换为 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) 约束。
我正在尝试在 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
我怎样才能完成这项工作?谢谢!
有一种简单的方法可以找到并纠正此类问题。
第一步:在你的程序中加入clpfd约束。为此,只需 1 将
(is)/2
替换为 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) 约束。