Показать сообщение отдельно
Старый 22.02.2005, 12:54     # 1
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
Проблема с 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(...)) - результат тот же).

Собсно вопрос: чё за ботва? Никто не в курсах?

Кстати, программа
Код:
predicates
  x(integer)
clauses
  x(X) if free(X), write("free"), nl, !.
  x(_) if write("bound"), nl.
работает правильно
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!
Ghost вне форума