Неопределенная ошибка процедуры в прологе 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)
,