imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 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 вне форума  
Старый 22.02.2005, 13:56     # 2
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 Отец (мать) всех Гуру
Гыхм... Проблема решилась изменением второго и четвертого правил:
Код:
  fact(N, _) if free(N), write("error: argument not found"), nl, !.
  fact(N, _) if bound(N), N < 0, write("error: illegal argument"), nl, !.
  fact(0, 1) if !.
  fact(N, F) if bound(N), N1 = N - 1, fact(N1, F1), F = N * F1.
Но вопрос остается в силе: почему не работал предыдущий код? И кстати, код
Код:
  x(X) if free(X), write("no arg!"), nl, !.
  x(X) if write("arg = ", X), nl.
тоже отказывается работать
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!

Последний раз редактировалось Ghost; 22.02.2005 в 17:02. Причина: склероZzz...
Ghost вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 00:22.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.