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

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

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').? Я столкнулся с этим, отвечая на вопрос о Prolog на SO. Хотя я мог ответить на вопрос человека, я не мог объяснить это конкретное поведение, и мне было интересно, сможет ли кто-нибудь еще.


person Vivin Paliath    schedule 04.11.2010    source источник


Ответы (2)


Хотя атомы в SWI-PROLOG можно обозначать с помощью одинарных кавычек, например, 'This is an atom', одинарные кавычки не нужны, когда синтаксический анализатор SWI-PROLOG может идентифицировать атом по последовательности символов, обычно начинающейся со строчной буквы. буквенный символ, например test. Если последовательность содержит пробелы (или некоторые другие символы), вам понадобятся одинарные кавычки для правильного обозначения атома. Буквенно-цифровые символы и некоторые знаки препинания, такие как подчеркивание _, допустимы, например, test5_6.

Если последовательность символов без одинарных кавычек должна начинаться с чего-то другого, например с числа 6k, синтаксический анализатор обработает ее как number; если бы это был буквенный символ верхнего регистра, такой как Test, синтаксический анализатор обработал бы его как переменную.

person Community    schedule 04.11.2010
comment
Ах, это поведение, характерное для SWI-Prolog? - person Vivin Paliath; 04.11.2010
comment
@Vivin Paliath: Возможно, по крайней мере, с SWI-PROLOG, хотя это кажется типичным и для других реализаций PROLOG, которые я видел. Но, тем не менее, да, парсер SWI-PROLOG сделает это, в частности, возможно, хотя бы для того, чтобы избавить вас от необходимости заключать в одинарные кавычки все ваши атомы :-) - person ; 04.11.2010

Это не специфическое поведение SWI — оно требуется стандартом. Есть простой способ увидеть это. Вы можете использовать это также для любого другого термина, синтаксис которого не очевиден. Любой тип на верхнем уровне:

?- X = 'test'.
X = test.

?- X = 'this is a test'.
X = 'this is a test'.

Ответ всегда правильный текст Пролога - это характерно для SWI, а также для многих других систем Пролога, таких как YAP, GNU, B, IF, 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)),[]))))
person false    schedule 04.11.2010