Чтение в нескольких словах для пролога

Я запускаю пролог через poplog в unix и задавался вопросом, есть ли способ прочитать несколько слов (например, заключить его в строку). Например, чтение (X) позволит X только 1 член. Однако, если я заключу пользовательский ввод с "", он вернет список кодов символов, это правильный метод, поскольку я не могу найти способ его преобразования обратно в читаемую строку.

Я также хотел бы узнать, содержит ли многословная строка заданное значение (например, если оно содержит "я был" ), и я не уверен, как я смогу это сделать.

Ответ 1

read/1 читает один элемент Пролога из стандартного ввода. Если вы введете строку, заключенную в ", она действительно прочитает эту строку как один объект, который является списком кодовых точек ASCII или Unicode:

?- read(X).
|: "I have been programming in Prolog" .
X = [73, 32, 104, 97, 118, 101, 32, 98, 101|...].

Обратите внимание на период после строки, обозначающий окончание срока. Чтобы преобразовать это в атом ( "читаемая строка" ), используйте atom_codes:

?- read(X), atom_codes(C,X).
|: "I have been programming in Prolog" .
C = 'I have been programming in Prolog'.

Обратите внимание на одинарные кавычки, так что это один атом. Но тогда атом атомный (очевидно) и, следовательно, не доступен для поиска. Для поиска последовательно используйте строки (нет atom_codes) и что-то вроде:

/* brute-force string search */
substring(Sub,Str) :- prefix_of(Sub,Str).
substring(Sub,[_|Str]) :- substring(Sub,Str).

prefix_of(Pre, Str) :- append(Pre, _, Str).

Тогда

read(X), substring("Prolog",X)

преуспевает, поэтому строка найдена.

Ответ 2

Кажется, что самый простой и простой ответ на ваш вопрос заключается в том, что вам нужно заключить свой ввод в одинарные кавычки, то есть:

read('Multiple Words In A Single Atom').

Двойные кавычки, как вы сказали, всегда конвертируются в коды ASCII.