Почему Swi-Prolog объединяет цитируемую и безвкусному строку (без пробелов) к тому же правилу?
-
29-09-2019 - |
Вопрос
Предположим, у меня есть следующие правила:
unify('test', 'this is a test').
run :- write('Enter something: '),
read(X),
unify(X, Y),
write('The answer is '), write(Y).
И тогда я бегу так следующим образом:
?- ['unify.pl'].
% unify.pl compiled 0.00 sec, -48 bytes
true.
?- run.
Enter something: test.
The answer is this is a test
true.
?- run.
Enter something: 'test'.
The answer is this is a test
true.
Почему Swi-Prolog объединяет оба test
и 'test'
к unify('test', 'this is a test').
? Я наткнулся на это, отвечая на вопрос о прологе. Хотя я смог ответить на вопрос человека, я не мог объяснить это конкретное поведение, и мне было интересно, сможет ли кто -нибудь другой.
Решение
Хотя атомы в SWI-Prolog могут быть обозначены с использованием одной цитаты, например, 'This is an atom'
, одиночные цитаты не нужно Когда Swi-Prolog Parser может идентифицировать атом из последовательности символов, обычно начиная с строчного буквенного характера, таких как test
. Анкет Если последовательность содержала пробел (или некоторые другие символы), вам понадобятся единые кавычки, чтобы обозначить атом. Буквенно -цифровые персонажи и некоторые знаки препинания, такие как подчеркивание _
в порядке, например, test5_6
.
Если последовательность символов без одной цитаты должна была начать с чего-либо еще, такого как номер 6k
, анализатор будет относиться к нему как к number
; если бы это был аспектный алфавитный характер, такой как Test
, анализатор будет рассматривать его как переменную.
Другие советы
Это не SWI -специфическое поведение - оно требуется стандартом. Есть простой способ увидеть это. Вы можете использовать это также для любого другого термина, синтаксис которого не очевиден. Любой тип в Toplevel:
?- X = 'test'. X = test. ?- X = 'this is a test'. X = 'this is a test'.
Ответ всегда действительный пролог текста - это специфично для SWI, но и для многих других систем прологовых систем, таких как YAP, GNU, B, если, Sicstus.
Другой способ увидеть это - использовать write_canonical / 1:
?- write_canonical('this is a test'). 'this is a test' true. ?- write_canonical([a,b,(c,d),{e,f}]). '.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))