В сообщении об ошибке указывается, что определенный вами предикат 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
и т. П.