【发布时间】:2016-03-28 08:14:59
【问题描述】:
我正在尝试将一些数字附加到列表中,这些数字的范围从 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).
但是当我测试目标时,它给了我“没有解决方案”。 我究竟做错了什么? 非常感谢您的帮助。
【问题讨论】:
-
我猜你应该用 [visual-prolog] 标记问题。
-
跟踪并查看每次递归调用
generate(A, Y, Z)时会发生什么。您可能会看到递归案例的问题。乍一看,这个逻辑似乎没有任何意义,X被递增(N = X + 1)然后结果也被递增(A = N + 1)。然后你在自制的追加上调用append(N,T,Z)(注意:标准prolog已经有一个append,虽然我不知道Visual Prolog是否有,而且它和你的不一样),但T不是' t 实例化。我怀疑这根本不是你想要的。 -
@lurker 谢谢你的澄清,我试图调用内置的附加方法但它不起作用,所以这个自制的方法是真的还是什么?,我正在递增in (N=X+1) 将范围内的下一个数字添加到列表中,并增加该数字 (A=N+1) 以再次调用该函数。抱歉,“T 未实例化”是什么意思?
-
内置的
append要求所有元素都是列表。您的追加将只接受一个术语X并从中创建一个元素列表[X],并且要求第二个参数是一个空列表[]。它非常有限,并没有真正做太多。T未实例化 表示T没有价值(在您调用append时)。您的append每次都会将T实例化为空列表(不确定这是否是您的意图)。 -
@lurker 不,这根本不是我想要的。非常感谢你的协助。但我只想将一个数字附加到特定的非空列表,如果我添加了这个 'append(X,T,[X|T])' ,其中 'T' 是任何非空列表,那会起作用吗?
标签: list prolog append visual-prolog