我想更改以下代码,以便genN(3,R)输出:
R=0.
R=1.
R=2.
而不是列表R=[0,1,2].
我将如何完成此操作?
genN(0,[]).
genN(N,R) :-
N > 0,
N1 is N-1,
genN(N1,R1),
append(R1,[N1],R),
!.
答案 0 :(得分:2)
你可以这样做:
gen(N, R) :-
gen_one(N, 0, R).
gen_one(N, V, R) :-
N > V,
( R = V; V1 is V+1, gen_one(N,V1,R)).
答案 1 :(得分:2)
.order(**postorderDepthFirst()**)
考虑到编写自己的from0_upto(N, R) :-
succ(N0, N),
between(0, N0, R).
版本并不是一件容易的事情(并非不可能),它在所有极端情况下都表现良好。这里有关于Stackoverflow的几次尝试,以及Prolog中的一个实现:http://www.cs.otago.ac.nz/staffpriv/ok/pllib.htm(搜索字符串“在/ 3之间”。
如果您需要列表,请生成一个列表。如果您在回溯时需要解决方案,请在回溯时生成解决方案。
答案 2 :(得分:2)
结合使用genN/2
和member/2
,如下所示:
?- genN(3,Rs), member(R,Rs).
Rs = [0,1,2], R = 0 ;
Rs = [0,1,2], R = 1 ;
Rs = [0,1,2], R = 2.