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

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

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

Ответы [ 2 ]

5 голосов
/ 04 ноября 2010

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

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

4 голосов
/ 05 ноября 2010

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

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

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

Ответ всегда действителен для текста Prolog - это относится только к SWI, но также и ко многим другим системам Prolog, таким как 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)),[]))))
...