ОШИБКА: поток user_input: 8: 5 Синтаксическая ошибка: ожидается оператор в Prolog

Мне нужно написать простую экспертную систему на Прологе для планирования занятий. В этой части кода я хочу, чтобы этот пользователь добавил в систему инструктора. Для этого я читаю два входных значения, но получаю эту ошибку.

addinstructor() :-    
    read(id),
    read(courseid),     
    assert(instructor(id, courseid)),    
    write("added").

Запрос:

?- addinstructor().
5
cse102.    

Затем я получаю ожидаемую оператором ошибку. Как мне исправить это, чтобы мой код работал?


person leiaorgana    schedule 14.12.2018    source источник
comment
Привет, я рекомендую прочитать Как спросить. Расскажите нам больше о том, что такое prupuse, ожидаемый результат, контекст, вход, выход. Все, что имеет смысл в вашем вопросе.   -  person Drag and Drop    schedule 14.12.2018
comment
Пустые скобки после addinstructor не нужны ни в определении, ни в запросе, который его вызывает. Я бы порекомендовал вам удалить их. Переменные пролога ДОЛЖНЫ начинаться с заглавной буквы; id и courseid - это атомы, а не переменные, и это проблема для вашего кода. Кроме того, assert/1 является нестандартным, используйте asserta/1 или assertz/1, которые дают вам контроль над порядком фактов в базе данных.   -  person Daniel Lyons    schedule 14.12.2018
comment
Спасибо за помощь, @Daniel Lyons. Проблема решена.   -  person leiaorgana    schedule 16.12.2018


Ответы (1)


Предикат read / 1 считывает термины Пролога, а не необработанные данные. Термины Пролога заканчиваются точкой.

Таким образом, если вместо ввода 5 вы введете 5., вы не получите ошибку.

Вместо использования предикатов из чтения и записи терминов, например read/1, вам следует использовать предикаты в примитивном символьном вводе-выводе для чтение символов или предикатов, которые работают со строками для чтения строк, например read_string / 3

Чтобы ответить на ваш следующий вопрос о том, как это реализовать, см. Пролог - выписывайте факты и читайте вводимые пользователем данные, а затем this.

person Guy Coder    schedule 14.12.2018