将Prolog的输出从列表更改为单个值

时间:2015-05-12 02:25:23

标签: prolog

我想更改以下代码,以便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),
    !.

3 个答案:

答案 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/2member/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.
相关问题