2013-12-15 9 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). 
Смежные вопросы