Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在prolog中将特定范围内的数字附加到列表中_List_Prolog_Append_Visual Prolog - Fatal编程技术网

List 如何在prolog中将特定范围内的数字附加到列表中

List 如何在prolog中将特定范围内的数字附加到列表中,list,prolog,append,visual-prolog,List,Prolog,Append,Visual Prolog,我试图将一些数字附加到列表中,这些数字的范围从X到Y,其中X是下限,Y是上限,然后将生成的数字保存到列表中。 我试过这个: domains list=integer*. predicates nondeterm generate(integer,integer,list). nondeterm append(integer,list,list). clauses append(X,[],[X]). generate(0,0,[]). ge

我试图将一些数字附加到列表中,这些数字的范围从
X
Y
,其中X是下限,
Y
是上限,然后将生成的数字保存到列表中。 我试过这个:

domains
    list=integer*.

predicates
    nondeterm generate(integer,integer,list).
    nondeterm append(integer,list,list).

clauses
    append(X,[],[X]).   
    generate(0,0,[]).
    generate(X,X,[]) :-
            write("The Upper And Lower Numbers Are The Same\n").
    generate(X,Y,[X|T]) :-
            X<=Y,
            N=X+1,
            A=N+1,
            append(N,T,Z),
            generate(A,Y,Z).

goal
    generate(1,4,Result).   
域
列表=整数*。
谓词
不确定生成(整数、整数、列表)。
不确定追加(整数、列表、列表)。
条款
附加(X,[],[X])。
生成(0,0,[])。
生成(X,X,[]):-
写入(“上下数字相同\n”)。
生成(X,Y[X | T]):-
试试这个:

?= findall(X,between(1,4,X),L).
L = [1, 2, 3, 4].
再见

备注:关于介于/3之间的纯实现,请参见:
试试这个:

?= findall(X,between(1,4,X),L).
L = [1, 2, 3, 4].
再见

备注:关于介于/3之间的纯实现,请参见:


我想你应该用[visual prolog]来标记这个问题。做一个跟踪,看看每次递归调用
生成(a,Y,Z)
时会发生什么。您可能会看到递归案例存在问题。乍一看,
X
递增(
N=X+1
),然后结果也递增(
A=N+1
),逻辑似乎没有任何意义。然后在自制的append上调用
append(N,T,Z)
(注意:标准prolog已经有一个
append
,虽然我不知道visualprolog是否有,它与您的不一样),但是
T
没有实例化。我怀疑这根本不是你想要的。@Lowerer谢谢你的澄清,我试图调用内置的appending方法,但它不起作用,那么这个自制的方法是真的还是什么?我在(N=X+1)中递增,将范围内的下一个数字添加到列表中,并递增该数字(A=N+1)再次使用它调用函数。抱歉,您所说的“T未实例化”是什么意思?内置的
append
要求所有元素都是列表。您的追加将只获取一个术语
X
,并从中生成一个元素列表,
[X]
,并且要求第二个参数为空列表
[]
。这是非常有限的,并没有真正做很多
T
未实例化意味着
T
没有值(在调用
append
时)。你的
append
每次都会将
T
实例化到空列表中(不确定这是否是你想要的)。@潜伏者不,这根本不是我想要的。非常感谢你的帮助。但是我只想在一个特定的非空列表中添加一个数字,如果我添加了这个'append(X,T,[X | T]),其中'T'是任何非空列表,这会起作用吗?我想你应该用[visual prolog]标记这个问题。做一个跟踪,看看每次递归调用
生成(a,Y,Z)
时会发生什么。您可能会看到递归案例存在问题。乍一看,
X
递增(
N=X+1
),然后结果也递增(
A=N+1
),逻辑似乎没有任何意义。然后在自制的append上调用
append(N,T,Z)
(注意:标准prolog已经有一个
append
,虽然我不知道visualprolog是否有,它与您的不一样),但是
T
没有实例化。我怀疑这根本不是你想要的。@Lowerer谢谢你的澄清,我试图调用内置的appending方法,但它不起作用,那么这个自制的方法是真的还是什么?我在(N=X+1)中递增,将范围内的下一个数字添加到列表中,并递增该数字(A=N+1)再次使用它调用函数。抱歉,您所说的“T未实例化”是什么意思?内置的
append
要求所有元素都是列表。您的追加将只获取一个术语
X
,并从中生成一个元素列表,
[X]
,并且要求第二个参数为空列表
[]
。这是非常有限的,并没有真正做很多
T
未实例化意味着
T
没有值(在调用
append
时)。你的
append
每次都会将
T
实例化到空列表中(不确定这是否是你想要的)。@潜伏者不,这根本不是我想要的。非常感谢你的帮助。但是我只想在一个特定的非空列表中添加一个数字,如果我添加了这个'append(X,T,[X | T]),其中'T'是任何非空列表,这会起作用吗?OP使用的是Visual Prolog。你知道VisualProlog是否有那些预定义的谓词吗?我看到那里有
findall
但没有
between
between
不是ISO谓词,有些Prolog没有。例如,GNU Prolog也没有介于
之间的
。这并不意味着语言有“问题”。尽管VisualProlog在很多方面都非常不标准,但从纯Prolog的角度来看,这使得它非常不吸引人。@潜伏者:GNU确实有
介于/3
之间的。您一定使用了非常旧的版本。这是我们的工作的一部分。因此,虽然不是ISO,但这是非ISO可以得到的最接近ISO的代码。如果您的Prolog系统没有介于/3之间的代码,您可以复制粘贴我在答案中给出的链接中的代码或任何其他执行相同操作的代码。您不能如此轻松地将SWI Prolog的源代码用于另一个Prolog系统,因为它本机实现在/3之间。OP使用的是Visual Prolog。你知道VisualProlog是否有那些预定义的谓词吗?我看到那里有
findall
但没有
between
between
不是ISO谓词,有些Prolog没有。例如,GNU Prolog也没有介于
之间的
。这并不意味着语言有“问题”。尽管VisualProlog在很多方面都非常不标准,但从纯Prolog的角度来看,这使得它非常不吸引人。@潜伏者:GNU确实有
介于/3
之间的。您一定使用了非常旧的版本。这是我们的工作的一部分。因此,虽然不是ISO,但它与ISO的关系与非ISO的关系一样密切