Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Vivin PaliathОтветов: 2

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

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

prologunificationiso-prologunify

Ответы

Ответ 1 · рейтинг 5 · Community

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

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

Ответ 2 · рейтинг 4 · false

Это не специфическое поведение 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)),[]))))

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы