go / 0 Неопределенная процедура save / 1 - PullRequest
2 голосов
/ 24 октября 2011

swi-prolog 5.10.2

Я набрал эту программу пролога. Однако, когда я запускаю опцию a, я получаю следующую ошибку.

go/0 Undefined Procedure save/1

Я уверен, что сохранитьявляется правильным предикатом ключевого слова, и путь к файлу также существует.Не уверен, где я иду не так здесь.

What does the /0 /1 mean in go and save?

Исходный код

/* Shopping list */

go:-reconsult('~/projects/prolog/chap7/shopping.pl'),
    write('a: See list'), nl,
    write('b: Add to list'), nl,
    write('c: Delete from list'), nl,
    read(Choice),
    choice(Choice),
    save('~/projects/prolog/chap7/shopping.pl').

/*
  facts for shopping
*/
item(potatoes).
item(bread).
item(coffee).

/*
  Rules for shopping list
*/
choice(a):-listing(item), nl.
choice(b):-write('Enter an item: '),
        read(Item),
        assert(item(Item)).
choice(c):-write('Item to delete: '),
        read(Item),
        retract(item(Item)).
choice(_):-write('Incorrect entry.'), nl.

Заранее большое спасибо,

Ответы [ 3 ]

6 голосов
/ 30 октября 2011

В сообщении об ошибке указывается, что определенный вами предикат go/0 использует предикат save/1, который система не распознает и помечает как неопределенную процедуру.Предикаты обычно идентифицируются индикатором предиката в форме name/arity, где name - это имя предиката, представленного в виде атома, а arity - число, представляющее, сколько параметров предикат был определен, принимая: так, например, go/0 - это идентификатор для предиката go, без параметров, определенных в вашей программе;save/1 - идентификатор предиката save с одним параметром, который вы пытаетесь вызвать, но система не может найти.Когда предикат был определен в двух или более перегруженных версиях, например, с разной арностью для каждого определения, на него можно ссылаться, заключая каждую арность в скобки, разделенные запятой, например p/[1,2].Предикаты иногда называют процедурами, причем эти два термина примерно эквивалентны.

Как можно видеть в старых руководствах SWI-Prolog (ссылка относится к версии 2.9) save/1 действительно используется длябыть определенным в стандартной библиотеке и общедоступным в этих системах.Даже в этих старых системах было предложено использовать save_program/[1,2] для создания новой программы вместо save/1, которая, как говорили, использовалась только для целей отладки.Однако в современных системах SWI-Prolog ни save/1, ни save_program/[1,2] не доступны.Хотя кажется, что для save/1 нет эквивалентного предиката, роль save_program/[1,2] взяла на себя qsave_program/[1,2], о которой вы можете прочитать о в последней версии руководства .Обязательно прочитайте также о его ограничениях , на случай, если вы захотите расширить свою программу за пределы простого фрагмента, который вы разместили здесь.

Никогда не применяя такого рода процедуры, ядолжен предположить, что вы знаете, что делаете.Однако, заметив вызов reconsult/1 в начале вашей программы, который использует тот же файл, который был сохранен save/1 позже, я умоляю вас осознать, что есть разница между кучей предикатов Prolog в текстовом файле, то есть в форматеreconsult/1 может читать и понимать, а также полутекстовый полубинарный формат, который, по крайней мере, qsave_program (но я поддерживаю save и save_program тоже) использует для записи программы на диск.Поскольку, читая ваш код, кажется, вы можете быть заинтересованы в хранении элементов списка покупок, в качестве примечания я хотел бы добавить, что вы можете сохранять предикаты интереса в текстовом файле, используя комбинацию listing/1 с процедуры ввода-вывода , такие как open/3, set_output/1, current_output/1 и т. П.

3 голосов
/ 31 октября 2011

Вы пишете: «Ищете ответный чертеж от заслуживающего доверия и / или официального Источники ". Если вы хотели получить личную обратную связь, вы должны опубликовать свой вопрос в списке рассылки SWI:

SWI-Prolog 5.11.29, список рассылки

Обычно у вас есть главный автор пролога SWI в цикле, а также много участников.

С наилучшими пожеланиями

2 голосов
/ 28 октября 2011

Не уверен, почему вы получаете ошибку, так как я не очень знаком с SWI Prolog, но / 1/0 означает количество аргументов в предикате. В этом случае вы вызываете save с 1 аргументом, следовательно, save / 1.

Кроме того, вы пытались использовать предикат save_program / 1? Насколько я могу судить, сохранение должно использоваться только для отладки (от http://euclid.barry.edu/~segami/Manual/sec-2.9.html).

В примерах, которые я видел, предикат save / save_program всегда вызывался без кавычек или расширения файла. У меня сложилось впечатление, что язык обработал эту часть для вас. Как: сохранить (имя файла) вместо сохранения ('filename.pl').

...