我试图创建一个给定N的程序,我需要Q = 0 ... N。
因此,如果给定N = 1:Q = 0.如果给定N = 5:Q = 0,Q = 1,...,Q = 4
到目前为止我的尝试:
values(N,Q) :- values_helper(0,N,Q).
values_helper(N, N, Q).
values_helper(X,N,Q) :- X0 is X + 1, X0 < N, values_helper(X0,N,X0).
我背后的逻辑是我增加X直到它达到N的值,此时程序停止。但是,我没有得到Q的任何绑定,只是一个空集。我也知道我忽略了在N - 1停下来。
编辑:修正了描述的含糊之处。
答案 0 :(得分:1)
你的两个values_helper子句都没有达到预期的效果。如果前两个参数相同,第一个成功,并且不对Q施加任何约束。你真正想要的是Q被设置为等于第一个参数,只要它小于第二个参数:
values_helper(Q, N, Q) :- Q < N.
在第二个条款中,您再也不在任何地方使用Q.递归调用应该是values_helper(X0, N, Q)
,给出:
values_helper(X, N, Q) :- X0 is X + 1, X0 < N, values_helper(X0, N, Q).
这些条款给出了预期的输出:
?- values(5,Q).
Q = 0 ? ;
Q = 1 ? ;
Q = 2 ? ;
Q = 3 ? ;
Q = 4 ? ;
no
注意,对于任何N <= 0,这终止时没有找到Q的任何值,我认为这是预期的行为。