2013-12-16 3 views
0

У меня есть предикат, который получает вход bst T и возвращает список S значений, содержащихся в bst, которые принадлежат определенному диапазону [R1, R2], и это отлично работает. Когда я пытаюсь подсчитать итерацию, чтобы получить список на выходе, я получаю Always false. Это код моего предиката:Пролог: итерация счетчика в дереве двоичного поиска

findExamsInRange(R1, R2, T, S, N) :- 
    find(R1, R2, T, S, N), 
    N > 0. 

find(R1, R2, nil, [], N). 
find(R1, R2, t(V,L,R), S, N) :- 
    V >= R1, 
    V =< R2, 
    find(R1,R2, L, L,NL), 
    find(R1,R2, R, LR,NR), 
    append([V|LL], LR, S), 
    N is NL+NR+1. 
find(R1, R2, t(V,L,R), S, N) :- 
    V < R1, 
    find(R1, R2, R, S, N). 
find(R1, R2, t(V,L,R), S, N) :- 
    V > R2, 
    find(R1, R2, L, S, N). 

Может кто-нибудь помочь мне, почему я не могу получить значение N?

ответ

0

Если не первая статья о find/5 предиката:

find(R1, R2, nil, [], N). 

быть вместо этого:

find(_R1, _R2, nil, [], 0). 

При достижении листьев дерева, вы должны возвращать значение для N, что позволяет цель N is NL+NR+1 добиться успеха без ошибок.

-1

Вы должны использовать assert и retract определить глобальный счетчик:

inc_counter:- % normal case 
    retract(counter(X)), !, 
    Y is X+1, 
    assert(counter(Y)). 
inc_counter:- % if counter is not defined yet 
    assert(counter(1)). 

Вы поместите inc_counter в положениях которых Итерации вы хотите посчитать, и запрос конечного результата с использованием counter(X).

Смежные вопросы