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)
успешно, поэтому строка была найдена.