尝试在Prolog中生成非零整数列表
我试图在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
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
我怎样才能做到这一点?谢谢 有一种简单的方法来发现和纠正这些问题
(#=)/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.
我假设您已经在初始文件的某个地方放置了
:-use_module(library(clpfd))。
,以便您可以在所有程序中使用CLP(FD)约束 这是一个很好的解决方案,但我需要一个不使用clpfd或任何其他库的解决方案。没有必要使用我的代码并尝试修复它。我可以接受一个与我所写的完全不同的解决方案。为了满足对1970年风格解决方案的需求,您只需反向执行步骤1:将(#=)/2
替换为我们找到的解决方案中的(is)/2
,瞧,这个荒谬的要求得到了满足!请保留与解决问题相关的标签。这些标签旨在帮助其他读者找到与他们正在寻找的主题相关的答案,而不是反映讲师的非感官要求!我已经恢复了标签,因为使用CLP(FD)约束可以消除这个问题,这是您的问题和stackoverflow的许多其他问题的核心问题。这是因为讲师现在仍然像30年前那样教授Prolog,随着时间的推移,这些问题将通过向他们指出声明性解决方案来解决。