Я пытаюсь создать правила Prolog для перечисления «двоичных деревьев» в форме списка в Prolog. Я новичок в Prolog.
Дерево с 0 узлами - это пустой список:
[]
Дерево с 1 узлом:
[[],[]]
Дерево с двумя узлами имеет 2 возможности:
[[],[[],[]]]
[[[],[]],[]]
и так далее.
Вот мои правила:
bintree(0,[]).
bintree(1,[[],[]]).
bintree(N,[Lc,Rc]) :-
N > 1,
bintree(N1,Lc),
bintree(N2,Rc),
N1 >= 0,
N2 >= 0,
N3 is N1+N2+1,
N==N3.
Очевидно, что запросы на 0 и 1 работают. Для N = 2 он печатает одну из возможностей, но выдает ошибку после того, как я ввожу точку с запятой, чтобы получить другую возможность. Запросы для N> 2 напрямую выдают ошибку. Ошибка всегда одна и та же:
ERROR: >/2: Arguments are not sufficiently instantiated
Я читал об этой ошибке на некоторых веб-сайтах, но не могу понять, что здесь вызывает эту ошибку.
Заранее благодарны за Вашу помощь.
N
не имело значения, когда вы пыталисьN > 1
. Какой запрос вы пытаетесь удовлетворить? В вашем вопросе совсем не ясно. - person lurker   schedule 26.03.2015bintree(N1, Lc)
иbintree(N2, Rc)
вызываются сN1
иN2
неустановленными переменными. Таким образом, подпоследовательностьN > 1
завершится ошибкой при этом сообщении об ошибке. - person lurker   schedule 26.03.2015bintree(N,[Cl,Cr]) :- integer(Nl), integer(Nr), Nl>=0, Nr>=0, Ns is Nl+Nr+1, N==Ns, bintree(Nl,Cl), bintree(Nr,Cr).
Теперь я получаю false для всех N ›1. В основном я хочу, чтобы он попытался построить левое и правое поддеревья так, чтобы сумма узлов в них плюс 1 (их родительский элемент) была равна N. - person kpjoshi   schedule 26.03.2015