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