2013-12-15 91 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).