Определение предикатов в SICStus Prolog / SWI-Prolog REPL - PullRequest
5 голосов
/ 06 сентября 2011

Я читаю 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)
| ?- 

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

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

Ответы [ 2 ]

10 голосов
/ 06 сентября 2011

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

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

т.е. обратитесь к пользователю или

| ?- assertz(woman(mia)).

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

7 голосов
/ 06 сентября 2011

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

Из SWI Prolog FAQ :

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

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

Попытка ввести это на верхнем уровне приводит к ошибке ниже. Зачем? Потому что правило это термин :-( Голова, Тело), ​​а потому что уровень выше интерпретирует термины как запросы. Там нет предиката с именем: - и два аргумента.

?- 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 (барабанный бой). Если это появляется в файле, это говорит о том, что этот раплан ест мясо. Если он появляется на верхнем уровне, он просит Пролог попытаться доказать, ест ли раплан мясо.

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

:- use_module(library(clpfd)).

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

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

...