Пролог: один элемент против одного элемента списка - PullRequest
5 голосов
/ 07 сентября 2011

При поиске неисправностей в большем задании для школы я обнаружил допущенную ошибку, когда обрабатывал один список элементов (стек с одним элементом), как если бы это был один элемент.Я решил свою проблему, однако в дальнейшем тестировании я заметил нечто странное:

48 ?- 1 is [1].
true.

49 ?- -1 is [-1].
ERROR: is/2: Type error: `character' expected, found `-1'

50 ?- 0.66 is [0.66].
ERROR: is/2: Type error: `character' expected, found `0.66'

Подобное поведение происходит при использовании =: = / 2 вместо is / 2.Так что по какой-то причине один список предметов считается таким же, как один предмет, но только для неотрицательных целых чисел.

Любопытство больше всего на свете ... кто-нибудь знает, почему это так?1007 * Спасибо!

1 Ответ

4 голосов
/ 07 сентября 2011

В SWI-Prolog (и, возможно, других) это связано с реализацией обратной совместимости выражений для оценки is/2 и =:=/2:

.(+Int,[])

A list of one element evaluates to the element. This implies "a" evaluates to 
the character code of the letter `a' (97). This option is available for 
compatibility only. It will not work if `style_check(+string)' is active as "a"
will then be transformed into a string object. The recommended way to specify the
character code of the letter `a' is 0'a.

Поскольку коды символов являются неотрицательными целыми числами, это может объяснить, почему поведение, которое вы видите, работает только для таких чисел, а не для чисел с плавающей запятой и отрицательных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...