Проблема с free/bound в Turbo Prolog 2.0
Есть простенькая программа на прологе, демонстрирующая работу предикатов free() и bound() (точнее говоря, она должна демонстрировать, но, как вы поняли, не делает этого):
Код:
predicates
fact(integer, integer)
clauses
fact(N, _) if free(N), write("error: argument not found"), nl, !.
fact(N, _) if N < 0, write("error: illegal argument"), nl, !.
fact(0, 1) if !.
fact(N, F) if N1 = N - 1, fact(N1, F1), F = N * F1.
Предикаты free/bound предназначены для определения, конкретизован ли параметр:
Цитата:
...в Прологе определены специальные предикаты bound и free, в которые в качетсве параметра передается имя параметра запроса. Предикат bound успешен в случае, если переданный в него параметр означен (т.е. был конкретизирован с какой-либо константой), предикат free - если параметр свободен...
|
Так вот, по идее, задав программе вопрос fact(X, 1) я должен получить ответ error: argument not found и программа завершится, но этого не происходит: система пытается кокретизировать запрос со вторым правилом и, есессно, материться на то, что дескать Free variable in expression (свобоная переменная в выражении), чего не должно происходить в случае успешного выполнения первого правила, в конце которого стоит предикат отсечения ( !). Другими словами, почему-то не срабатывает предикат free (пробовал вместо него использовать not(bound(...)) - результат тот же).
Собсно вопрос: чё за ботва? :confused: Никто не в курсах? :help:
Кстати, программа
Код:
predicates
x(integer)
clauses
x(X) if free(X), write("free"), nl, !.
x(_) if write("bound"), nl.
работает правильно :idontnow:
|