Ошибка пролога Swi: отображается правда, но не ложь

Только что установил SWI-Prolog на мою машину W8, и он выдает ошибку.

Вот ошибка:

ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

Допустим, мой исходный файл пролога содержит один факт:

 Prolog source...

 it_is_monday.   //The fact

Итак, я компилирую буфер и получаю:

.../documents/prolog/prologSource compiled 0.00 sec, 2 clauses

Теперь, когда я ввожу

it_is_monday. 

Результат, как и ожидалось, равен true. Однако, когда я ввожу, говорю,

some_other_statement.

Я получаю сообщение об ошибке выше, а не false. Кто-нибудь может сказать мне, что здесь происходит?

Решение: Другая версия пролога.


person Lee Brindley    schedule 18.11.2013    source источник


Ответы (3)


Существует стандартный флаг Пролога, unknown, который по умолчанию установлен в SWI-Prolog и других современных компиляторах Пролога на error, что означает, что попытка вызова неизвестного предиката приведет к исключению. Этот флаг можно установить (используя стандартный предикат set_prolog_flag/2) вместо fail, чтобы получить ожидаемое поведение, но это не рекомендуется, поскольку может затруднить отладку. Например. простая опечатка в имени предиката приведет к сбою, который в сложной программе может быть трудно отследить, в то время как ошибка существования предиката укажет виновника на месте.

person Paulo Moura    schedule 18.11.2013
comment
Да, это полезная функция. Моя неспособность определить предикат или какая-то опечатка/изменение в названии предиката, безусловно, самая типичная моя ошибка при написании Пролога. Конечно, если кто-то хочет заглушить предикат с следствием fail, это может быть полезной тактикой. - person hardmath; 18.11.2013

Вы получаете ошибку

ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

потому что вы не определили процедуру, которую пытались выполнить. (поэтому и написано undefined)

Если вы определите его, отредактировав файл .pl и написав some_other_statement.

и вы запустите его снова, вы получите

1 ?- some_other_statement.
true.

В Прологе вам нужно определить каждую процедуру, которую вы хотите выполнить.

Когда вы пытаетесь выполнить неопределенную процедуру, имя процедуры будет отображаться в сообщении об ошибке. Итак, если вы не определили some_other_statement., ошибка будет:

2 ?-  some_other_statement.
ERROR: toplevel: Undefined procedure: some_other_statement/0 (DWIM could not correct goal)

обратите внимание, что some_other_statement/0 отображается в полученной ошибке.

EDIT: Если вы хотите получить сообщение false, вам нужно будет определить что-то вроде some_other_statement(1)., а затем выполнить запрос вроде some_other_statement(12).

2 ?- some_other_statement(12).
false.
person Shevliaskovic    schedule 18.11.2013
comment
Извините, я не указал в вопросе, что ожидал ложь, а не ошибку, отсюда и путаница. Я использовал более старую версию пролога на другой моей машине, которая выдавала false, когда была представлена ​​неопределенная процедура. - person Lee Brindley; 18.11.2013
comment
Я отредактировал свой пост. Не знаю насчет старых версий, но на текущей выдает указанную ошибку - person Shevliaskovic; 18.11.2013

если вы хотите получить false из этого, вы можете добавить директиву

:- dynamic(some_other_statement/0).

в начале файла, поэтому при выполнении запроса

?- some_other_statement.

вы получите ложное

person Ricardo Zorio    schedule 23.05.2014