Безопасные тесты типа в Прологе
ISO-Prolog (ISO / IEC 13211-1: 1995, включая Cor.1: 2007, Cor.2: 2012) предлагаетследующие встроенные предикаты для проверки типа термина:
8.3 Типовое тестирование1 вар / 1. 2 атом / 1. 3 целое число / 1. 4 поплавка / 1. 5 атомных / 1. 6 Соединение / 1. 7 nonvar / 1. 8 количество / 1. 9 вызываемым / 1. 10 земля / 1. 11 acyclic_term / 1.
В пределах этой группы есть те, чья цель состоит исключительно в тестировании на определенную реализацию, то есть 8.3.1.var/1
, 8.3.7nonvar/1
, 8.3.10ground/1
и те, которые предполагают, что термин достаточно инстанцирован, чтобы проверка типа была безопасной. К сожалению, они сочетаются с тестированием на конкретный экземпляр.
Рассмотреть цельinteger(X)
который терпит неудачу, еслиX
является ненарным термином, который не является целым числома также когдаX
переменная Это разрушает многие желательные декларативные свойства:
?- X = 1, integer(X).
true.
?- integer(X), X = 1.
false.
В идеале второй запрос должен был бы успешно выполняться с использованием некоторой формы сопрограммирования; или это приведет к ошибке инстанцирования1 в соответствии склассификация ошибок, В конце концов:
7.12.2 Классификация ошибокОшибки классифицируются в соответствии с формой Error_term:
а) Должна быть ошибка установления, когда
аргумент или один из его компонентов является переменной, и
требуется конкретный аргумент или компонент. Она имеет
формаinstantiation_error
.
...
Обратите внимание, что эта неявная комбинация тестирования экземпляров и тестирования типов приводит ко многим ошибкам в программах Prolog, а также здесь, в SO.
Быстро исправить эту ситуацию можно было бы добавить явный тест перед каждым встроенным тестом, либо подробно
( var(T) -> throw(error(instantiation_error,_)) ; true),
integer(T), ....
или более компактно, как
functor(T, _,_),
integer(T), ....
это может быть даже
T =.. _,
integer(T), ...
Мой вопрос двоякий:
Как обеспечить эту функциональность на уровне пользователя?
и, чтобы сделать это также немного сложным:
Какая самая компактная реализация безопаснееatomic/1
написано в ISO-Прологе?
1 Другими менее желательными вариантами было бы зацикливание или создание ошибки ресурса. Еще предпочтительнее неверный результат.