Pruebas de tipo más seguras en Prolog

ISO-Prolog (ISO / IEC 13211-1: 1995 incluyendo Cor.1: 2007, Cor.2: 2012) ofreceel seguimiento predicados incorporados para probar el tipo de término:

8.3 Prueba de tipo

1 var / 1. 2 átomos / 1. 3 enteros / 1. 4 flotadores / 1. 5 atómico / 1. 6 compuesto / 1. 7 nonvar / 1. 8 número / 1. 9 invocables / 1. 10 suelo / 1. 11 acyclic_term / 1.

Dentro de este grupo hay aquellos cuyo propósito es únicamente probar una cierta instanciación, es decir 8.3.1var/18.3.7nonvar/18.3.10ground/1y aquellos que suponen que un término está suficientemente instanciado para que la prueba de tipo sea segura. Desafortunadamente, se combinan con pruebas para una instanciación concreta.

Considera la metainteger(X) que falla siX es un término no variable que no es un enteroy cuandoX es una variable Esto destruye muchas propiedades declarativas deseables:

?- X = 1, integer(X).
true.

?- integer(X), X = 1.
false.

$15el seguimiento16$clasificación de errores. Después de todo:

7.12.2 Clasificación de errores

Los errores se clasifican según la forma de Error_term:

a) Habrá un error de instanciación cuando un
argumento o uno de sus componentes es una variable y un
Se requiere argumento o componente instanciado. Tiene
la formainstantiation_error.

...

Tenga en cuenta que esta combinación implícita de pruebas de instanciación y pruebas de tipo conduce a muchos errores en los programas Prolog y también aquí en SO.

Una solución rápida a esta situación sería agregar una prueba explícita frente a cada prueba incorporada, ya sea de forma vergonzosa como

   ( var(T) -> throw(error(instantiation_error,_)) ; true),
   integer(T), ....

o más compacto como

functor(T, _,_),
integer(T), ....

podría ser incluso

T =.. _,
integer(T), ...

Mi pregunta es doble:

¿Cómo proporcionar esta funcionalidad a nivel de usuario?

y, para hacer esto también un poco desafiante:

¿Cuál es la implementación más compacta de un sistema más seguro?atomic/1 escrito en ISO-Prolog?

1 Otras opciones menos deseables serían hacer un bucle o producir un error de recurso. Todavía preferible a un resultado incorrecto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta