Чтение несколькими словами для пролога - PullRequest
10 голосов
/ 10 февраля 2010

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

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

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

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)

успешно, поэтому строка была найдена.

0 голосов
/ 14 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...