Мой предикат для вычисления глубины ветки двоичного дерева не работает - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь вычислить глубину левой ветви в двоичных деревьях, но предикат продолжает давать сбой!

Я пытался trace. и пришел к выводу, что статус сбоя должен исходить от функтора is\2, но я до сих пор не могу понять, в чем проблема ...

leftdepth(void,0).
leftdepth(tree(_,Left,_),N):-leftdepth(Left,N),N is N+1.

Я ожидаю, что результат запроса leftdepth(tree(3,tree(2,tree(5,void,void),tree(7,void,void)),void),3). будет истинным, но выводит false.

1 Ответ

0 голосов
/ 10 января 2019

Звонок:

<b>N</b> is <b>N</b> + 1.

не имеет особого смысла. В Prolog переменная может быть объединена со значением, но вы больше не сможете «повторно объединять» ее с другим значением . Одна из концепций декларативного программирования заключается в том, что переменные не могут изменять значение.

Что вы можете сделать, это создать дополнительную переменную, одну для уровня " child ", и одну для уровня " parent ":

leftdepth(void, 0).
leftdepth(tree(_,Left,_), <b>N1</b>):-
    leftdepth(Left, N),
    <b>N1</b> is N+1.
...