IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Проблема с free/bound в Turbo Prolog 2.0 (http://www.imho.ws/showthread.php?t=80329)

Ghost 22.02.2005 12:54

Проблема с 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:

Ghost 22.02.2005 13:56

Гыхм... Проблема решилась изменением второго и четвертого правил:
Код:

  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.

тоже отказывается работать :idontnow:


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

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