Safer Typprüfungen in Prolog

ISO-Prolog (ISO / IEC 13211-1: 1995 einschließlich Cor.1: 2007, Cor.2: 2012) bietetfolgend eingebaute Prädikate zum Testen des Typs eines Begriffs:

8.3 Typprüfung

1 var / 1. 2 Atom / 1. 3 Integer / 1. 4 float / 1. 5 Atom / 1. 6 Verbindung / 1. 7 nonvar / 1. 8 Nummer / 1. 9 anrufbar / 1. 10 Boden / 1. 11 acyclic_term / 1.

Innerhalb dieser Gruppe gibt es diejenigen, deren Zweck es ist, nur auf eine bestimmte Instanziierung zu testen, dh 8.3.1var/1, 8.3.7nonvar/1, 8.3.10ground/1 und diejenigen, die davon ausgehen, dass ein Begriff so instanziiert ist, dass die Typprüfung sicher ist. Leider sind sie mit dem Testen auf eine konkrete Instanziierung verbunden.

Betrachten Sie das Zielinteger(X) was fehlschlägt wennX ist ein Nonvar-Begriff, der keine ganze Zahl istun wannX ist eine Variable. Dies zerstört viele wünschenswerte deklarative Eigenschaften:

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

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

Ideally die zweite Abfrage würde entweder mit einer Form von Coroutining erfolgreich sein; oder es würde ein Instanziierungsfehler1 laut dem Fehlerklassifizierung. Letztendlich

7.12.2 Fehlerklassifizierung

Errors werden nach der Form von Error_term klassifiziert:

a) Es soll ein Instanziierungsfehler auftreten, wenn ein
argument oder eine seiner Komponenten ist eine Variable und ein
instantiated Argument oder Komponente ist erforderlich. Es ha
die Forminstantiation_error.

...

Beachten Sie, dass diese implizite Kombination aus Instanziierungstest und Typentest zu vielen Fehlern in Prolog-Programmen und auch hier auf SO führt.

Eine schnelle Lösung für diese Situation wäre, einen expliziten Test vor jedem eingebauten Test hinzuzufügen, entweder wörtlich als

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

oder kompakter als

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

es könnte sogar @ se

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

Meine Frage ist zweifach:

Wie kann diese Funktionalität auf Benutzerebene bereitgestellt werden?

und, um das auch ein bisschen herausfordernd zu machen:

Was ist die kompakteste Implementierung eines sichererenatomic/1 geschrieben in ISO-Prolog?

1 Andere weniger wünschenswerte Optionen wären Schleifen oder das Erzeugen eines Ressourcenfehlers. Immer noch einem falschen Ergebnis vorzuziehen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage