2013-12-15 58 views
2

我有一个谓词,应该从列表中形成一个列表,只将这些数字放入一个新的列表中,这些列表在一定范围内。谓词起作用,但假设我想得到一个不包含边界的列表。 因此,我将条件A >= L, A =< R更改为A > L, A < R,但后来我只获得“True”,而Prolog则不输出任何内容。在一定范围内的列表

这里有什么问题?

我的代码是:

range([], _, _, []). 
range([A|L1], L, R, [A|L2]) :- 
    A>L, 
    A<R, 
    range(L1, L, R, L2). 

range([A|L1], L, R, L2) :- 
    A=<L; 
    A>=R, 
    range(L1, L, R, L2). 

这是程序的输出:

range([1,2,3,4,5], 1,4, X). 
?- range([1,2,3,4,5,6,7,8,9,10], 1,3, X). 
true . 

这就是我希望它输出:

?- range([1,2,3,4,5,6,7,8], 1, 5, X). 
X = [2,3,4] . 

回答

1

我想你忘记了需要括号

range([A|L1], L, R, L2) :- 
    (A=<L ; A>=R), 
    range(L1, L, R, L2). 

否则,当A=<L,你失去的递归调用,然后变量仍然不会被实例化。

1

连词和disjuntion优先,,;,因此有必要写第三条:

range([A|L1], L, R, L2) :- 
    ( A=<L 
    ; A>=R 
    ), 
    range(L1, L, R, L2).