Безопасные тесты типа в Прологе

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 Другими менее желательными вариантами было бы зацикливание или создание ошибки ресурса. Еще предпочтительнее неверный результат.

Ответы на вопрос(2)

Ваш ответ на вопрос