Работа с динамическими предикатами, вызывающими сбои компиляции

Я пытаюсь запустить пример программы GNU Prolog, используемой в качестве примера во время моей курсовой работы. Код взят непосредственно с https://www.cpp.edu/%7Ejrfisher/www/prolog_tutorial/2_17pl.txt, и однажды мой профессор показал, как он работает.

Однако, когда я запускаю предоставленный пример кода, я получаю следующее предупреждение о компиляции:

| ?- consult('C:/Users/Chase/Desktop/Prolog files/newAnimal.pro').
compiling C:/Users/Chase/Desktop/Prolog files/newAnimal.pro for byte code...
C:/Users/Chase/Desktop/Prolog files/newAnimal.pro:74:12: syntax error: . or operator expected after expression
    1 error(s)
compilation failed

Строка, которая мешает корректной компиляции программы:

:- dynamic yes/1,no/1.

О чем я прочитал здесь: https://www.swi-prolog.org/pldoc/man?predicate=dynamic/1

Однако, несмотря на попытки переписать и переформатировать раздел, мне все равно не удалось его скомпилировать.

Любая помощь в том, почему предоставленный код может не работать?

Я использую консоль Windows GUI GNU Prolog V1.4.5.


person Xlite    schedule 24.02.2021    source источник
comment
Я думаю, что dynamic не является оператором в Gnu-Prolog, попробуйте использовать :- dynamic([yes/1, no/1]). или :- dynamic(yes/1), dynamic(no/1)..   -  person slago    schedule 24.02.2021


Ответы (1)


Стандарт ISO Prolog не требует, чтобы dynamic (или multifile, или discontiguous) объявлялось как оператор. Несколько систем делают это (например, SWI-Prolog, как вы упомянули), но не GNU Prolog. Таким образом, чтобы обеспечить переносимость кода, избегайте использования dynamic в качестве оператора. Вместо этого напишите:

:- dynamic(yes/1).
:- dynamic(no/1).

Or:

:- dynamic((yes/1, no/1)).

Or:

:- dynamic([yes/1, no/1]).

Это стандартные альтернативы для объявления нескольких предикатов как динамических.

Кроме того, у GNU Prolog есть прекрасное руководство (часть его установки), к которому вы должны обращаться при использовании GNU Prolog.

person Paulo Moura    schedule 24.02.2021
comment
Что именно было не так, большое спасибо за понимание! - person Xlite; 24.02.2021
comment
Учитывая, что dynamic не объявлен как оператор в GNU Prolog, между атомом dynamic и аргументами директивы не может быть пробела. - person Paulo Moura; 24.02.2021