Im ersten Teil des ISO-Standards für Prolog, ISO / IEC 13211-1: 1995, wird der Begriff "Typ" für verschiedene Dinge verwendet. Dies führt oft zu Verwirrung. Zum Beispiel eine Seite namens IsoErrata ( archivierte Version , < a href="http://eclipseclp.org/wiki/Prolog/IsoErrata"> Quelle ) (stellt fest, dass diese Seite nicht mit ISO verwandt ist):
7.12.2 und 8.1.2.1
Es gibt eine Verwirrung darüber, was ein "Typ" ist. Es scheint 3 zu sein verschiedene Gruppen:
- Diejenigen, die in 8.1.2.1 aufgeführt sind und auch als ValidTypes in type_error-Termen in 7.12.2.b
vorkommen- Diejenigen, die in 8.1.2.1 aufgelistet sind und als gültige Domain in termance_error in 7.12.2.c
vorkommen- Diejenigen, die nur in 8.1.2.1 aufgeführt sind
Darüber hinaus gibt es in 7.12.2.c ValidDomains, die nicht aufgelistet sind 8.1.2.1, vermutlich versehentlich (zB io_mode).
8.14.3.3.f
Die Vorlage benötigt den Typ
atom_or_atom_list
für das 3. Argument, aber seltsamerweise ist der erforderliche Fehler hier %Code%. Dies führt zu (siehe Beispiele)
type_error(list,Operator)
wo
op(30,xfy,0) =====> error(type_error(list,0))
odertype_error(atom,0)
passender wäre (beachte aber, dasstype_error(atom_or_atom_list,0)
nicht zu den ValidTypes aufgelistet in 7.12.2!). Für ECLiPSe haben wir uns deshalb entschiedenatom_or_atom_list
nur, wenntype_error(list,Op)
eine falsche Liste ist undOp
wenntype_error(atom,Op)
ein anderes Nicht-Atom ist.
Also in welchen Bedeutungen wird "Typ" verwendet, und was soll man über die obige Verwirrung tun?
Es gibt im Wesentlichen drei verschiedene Verwendungen für "type" in ISO / IEC 13211-1:
Typen wie in 7.1 Arten definiert. Diese sind: Variable (7.1.1), Ganzzahl (7.1.2), Fließkomma (7.1.3), Atom (7.1.4), zusammengesetzter Ausdruck (7.1.5) und einige Typen, die auf diesen basieren. Die nächsten beiden Verwendungen beziehen sich häufig auf 7.1 oder auf die Terminologie (3 Definitionen) für ihre Definition. Wichtig ist, dass hier Variablen enthalten sind. Diese Klassifizierung wird durch Prologs Syntax motiviert:
7.1 Arten
Der Typ eines Begriffs wird durch seine abstrakte Syntax (6.1.2) bestimmt.
Typen wie in 7.12.2 definiert b. Dies sind die Typen, die in Typfehlern der Form type_error(ValidType, Culprit)
verwendet werden. Beachten Sie, dass Variablen nun nicht mehr enthalten sind, da diese entweder als Instanziierungsfehler (7.12.2 a) oder als Deinstallationsfehler (7.12.2 k, Cor.2 ).
ValidType
∈ {atom, atomic, byte, callable, character, compound, evaluable, float, in_byte, in_character, integer, list, number, pair, predicate_indicator
}
Typen wie in der Unterkapitel Vorlage und Modi:
8.1.2.1 Art eines Arguments
Der Typ jedes Arguments wird durch eines der folgenden Atome definiert:
atom, atom_or_atom_list, atomic, byte, callable_term, character, character_code, character_code_list, character_list, clause, close_options_list, compound_term, evaluable, flag, head, in_byte, in_character, in_character_code, integer, io_mode, list, nonvar, number, operator_specifier, predicate_indicator, read_options_list, source_sink, stream, stream_options_list, stream_or_alias, stream_position, stream_property, term, write_options_list
Das obige Zitat erwähnt nur 7.12.2 und 8.1.2.1 und wie sie zueinander in Beziehung stehen. Das braucht also etwas mehr Ausarbeitung:
Arten von 7.12.2 werden mit Typfehlern gemeldet. Aber Typen in 8.1.2.1 dienen nur in der Untergruppe Template und Modes des Definition eines eingebauten . Sie sind nicht per se geeignet, um für Fehler verwendet zu werden. In einer konkreten Definition eines integrierten Prädikats gibt es eine Unterklausel xyz2 Template und Modi und xyz3 Fehler . Hier sind einige Beispiele für Typen von 8.1.2.1 (fett in der obigen Liste).
write_options_list
Es gibt keine direkte Eins-zu-eins-Entsprechung zwischen write_options_list
und den in den Fehlern verwendeten konkreten Typen. Stattdessen wird ein Typ list
und eine Domäne write_option
verwendet. Daher wird der komplexe Typ write_option_list
niemals signalisiert:
8.14.2.2 Vorlage und Modi
write_term(@stream_or_alias, @term, @write_options_list)
8.14.2.3 Fehler
...
c)
Options
ist weder eine Teilliste noch eine Liste
-type_error(list, Options).
...
e) Ein Element
E
derOptions
Liste ist weder ein
Variable noch eine gültige Schreiboption
-domain_error(write_option, E).
atom_or_atom_list
Das ist noch komplexer. Auf der einen Seite wird eine Atomliste erwartet, aber auch ein Atom ist in Ordnung. Also haben wir list
und atom
als relevante Typen:
8.14.3.2 Vorlage und Modi
op(+integer, +operator_specifier, @atom_or_atom_list)
8.14.3.3 Fehler
...
f)
Operator
ist weder eine Teilliste noch eine Liste noch ein
Atom
-type_error(list, Operator).
g) Ein Element
E
derOperator
Liste ist weder eine
Variable noch ein Atom
-type_error(atom, E).
Es ist ebenso plausibel, atom
für den Fehler f zu erzeugen. Auf der anderen Seite sind beide Fehler gleichermaßen anwendbar, und list
ist definitiv die beste für missgebildete Listen wie [a|nonlist]
, während atom
nicht unbedingt besser für 111
ist, was ein OCR-Fehler von [l]
sein könnte.
callable_term
Der entsprechende Typfehler enthält callable
. Wie in
8.10.1.2 Vorlage und Modi
findall(?term, +callable_term, ?list)
8.10.1.3 Fehler
...
b) Ziel ist weder eine Variable noch ein aufrufbarer Term -
type_error(callable, Goal)
.
in_character_code
Es gibt weder einen entsprechenden Typ in 7.12.2 b, noch eine Domäne in 7.12.2 c. Aber in 7.12.2 f ist es für Darstellungsfehler definiert:
8.12.1.2 Vorlage und Modi
...
get_code(?in_character_code)
get_code(@stream_or_alias, ?in_character_code)
8.12.1.3 Fehler
...
j)
Code
ist ein Integer, aber kein In-Character-Code
(7.1.2.2)
-representation_error(in_character_code).
io_mode
Dieses ist in 8.1.2.1 aufgeführt, im Gegensatz zum zitierten Text. Es erscheint auch in 7.12.2 c und wird verwendet:
8.11.5.3 Fehler
...
h)
Mode
ist ein Atom, aber kein Ein- / Ausgabemodus
-domain_error(io_mode, Mode).
character_code_list
Ähnlich wie write_options_list
. Es wird jedoch fälschlicherweise in 7.12.2 c erwähnt. Das ist ein Fehler im Standard, der in Cor.3: 2017 entfernt wurde .
Tags und Links iso-prolog