Неопределенная ошибка процедуры в прологе SWI

Запуск пролога SWI на windows 8 в первый раз.

это файл моей программы (.pl), очень простой только с 3 фактами: (Я начинающий пролог)

hello.
a.
b.

Когда я загружаю его (консультируюсь) в пролог-SWI и работаю с программой, я получаю эту ошибку в своем выводе:

12 ?- b.
true.

13 ?- a.
true.

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

Теперь, если это простая ошибка, потому что c никогда не указывался в программе как факт, тогда это нормально, но после просмотра примеров в Интернете и тех, которые я нашел в классе Пролог, в этих примерах ответы yes когда факт есть в программе, и no когда это не так. Мои ответы true если это так, и дает мне эту длинную ошибку, если это не так.

Смотрите эту ссылку для примера

Где ответы no для тумана.

1 ответ

Решение

У SWI немного другая оболочка верхнего уровня, сильно вдохновленная оболочкой Prolog IV. Идея в том, что вы снова получите в ответ ответ на исполняемый запрос. Следовательно true. вместо yes а также false. вместо no, Это особенно полезно, если вы хотите "вставить" ответ в следующий запрос.

?- append(Xs,Ys,[1,4,7]).
Xs = [],
Ys = [1, 4, 7] ;
Xs = [1],
Ys = [4, 7] ;
Xs = [1, 4],
Ys = [7] ;
Xs = [1, 4, 7],
Ys = [] ;
false.

Это еще более полезно, когда вы работаете с такими ограничениями, как library(clpfd):

?- use_module(library(clpfd)).
true.

?- X #> 3, X#>=Y,abs(X) #< 100.
X in 4..99,
X#>=Y,
Y in inf..99.

Другая проблема - это обычное поведение по умолчанию во многих системах: если в предложении нет никаких других упоминаний о конкретном предикате, система предполагает, что вы неправильно набрали имя, и выдает соответствующую ошибку. Если вы действительно настаиваете (не!), Вы можете переключить время поведения в конце 1970-х с set_prolog_flag(unknown, fail). но лучше сразу переключи set_prolog_flag(unknown, error),

Другие вопросы по тегам