Есть задача для пролога, которая звучит так: напишите предикат istree, который возвращает true, только если его аргументом является двоичное дерево. Пример:
?- istree(t(a,t(b,nil,nil),nil)).
Возвращает да
?- istree(t(a,t(b,nil,nil))).
Возвращает нет
Я попробовал написать свой код и остановился на этой версии:
domains
tree = nil; t(symbol, tree, tree).
predicates
istree(tree).
isleaf(tree).
clauses
istree(nil).
istree(t(_, Left, Right)) :-
istree(Left),
istree(Right).
isleaf(t(_, nil, nil)).
goal
%istree(t(a, t(b, nil, nil), nil)).
istree(t(a, t(b, nil, nil))).
Теперь, когда я пытаюсь ввести вторую строку из примера (istree(t(a, t(b, nil, nil))).), получаю ошибку: E;Test_Goal, pos: 246, 507 Type error: Wrong number of arguments
Как я могу это исправить?
@false Прошу прощения, \_ — опечатка. По поводу t(a, ...) - подскажите пожалуйста, как исправить код, чтобы во втором случае вместо ошибки он выдавал в консоль "Нет"? Нам в университете плохо рассказали этот материал и теперь я не знаю, как выполнить это задание :(
Я имел в виду, что вы вводите istree(t(a, t(b, nil, nil)))., который, скорее всего, следует читать istree(t(a, t(b, nil, nil), nil)).
@false В этой задаче в качестве примера указано, что при вводе istree(t(a, t(b, nil, nil), nil)). должно выводиться «да», но при вводе istree(t(a, t(b, nil, nil, nil)) должно выводиться «Нет». Я получил вывод для случая «да», но вместо «Нет» получаю ошибку о недостаточном количестве аргументов.
Затем система Пролога, которую вы используете (нестандартная) Turbo-/PDC Prolog, и упражнения (которые, очевидно, предполагают ISO Prolog) просто не синхронизированы.





вам нужно определить второй аргумент «дерево» как пустой
Вот пример: istree(t(a, t(b, nil, nil), empty)).
domains
tree = nil; t(symbol, tree, tree); empty().
predicates
istree(tree).
clauses
istree(nil).
istree(t(_, L, R)) :- istree(L), istree(R).
goal
istree(t(a, t(b, nil, nil), empty)).
У вас здесь
t(a, ...), поэтому не хватает еще одного аргумента. Также неясно, что означает\_.