Вопрос

Я читаю http://cs.union.edu /~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1, но у меня возникли проблемы с запуском следующего предиката:

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal:  user:woman(mia)
| ?- 

Если, с другой стороны, я записываю это в файл и запускаю "Обратиться к файлу", кажется, что все работает нормально...

Могу ли я определять предикаты только в файле, а затем обращаться к ним?Разве я не могу просто сделать это в самом редакторе?

Это было полезно?

Решение

Вы должны войти woman(mia). в файл, чтобы подтвердить это как факт.Если вы запишете это в интерпретатор, это будет воспринято как запрос, а не как факт.

Из самого Часто задаваемые ВОПРОСЫ по SWI Prolog:

Термины, которые вы вводите на верхнем уровне, обрабатываются как запросы, в то время как термины, которые появляются в файле, загружаемом в Prolog, обрабатываются как набор правил и фактов.Если текст читается так, как показано ниже, это правило.

carnivore(X) :- animal(X), eats_meat(X).

Попытка ввести это на верхнем уровне приводит к приведенной ниже ошибке.Почему?Поскольку правило - это термин:-(Head, Body), и поскольку верхний уровень интерпретирует термины как запросы.Нет предиката с именем :- и двумя аргументами.

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR:   Rules must be loaded from a file ERROR:  
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt

Разве это не глупо?Ну, нет.Предположим, у нас есть термин eats_meat(rataplan).Если это отображается в файле, это подтверждает тот факт, что ратаплан ест мясо.Если он появляется на верхнем уровне, он запрашивает Prolog попытаться доказать, ест ли ратаплан мясо.

Если текст гласит

:- use_module(library(clpfd)).

Это директива.Директивы похожи на запросы, но вместо того, чтобы просить верхний уровень что-то сделать, они просят компилятор сделать что-то.Подобно правилам и фактам, таким терминам место в файлах.

Вместо записи в файл вы также можете использовать assert на верхнем уровне (как также будет объяснено позже в разделе часто задаваемых вопросов).

Другие советы

Немного раздражает делать предикаты в реплике. Вы могли бы сделать

| ?- ['user'].
woman(mia).
^D

т.е. консультируйтесь с пользовательским вводом, или

| ?- assertz(woman(mia)).

утверждать это. Оба неловко IMO - может быть лучший способ, я просто не знаю этого. В целом легче использовать сценарий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top