Почему Swi-Prolog объединяет цитируемую и безвкусному строку (без пробелов) к тому же правилу?

StackOverflow https://stackoverflow.com/questions/4100943

Вопрос

Предположим, у меня есть следующие правила:

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)),[]))))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top