Tupel: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
 
(289 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 6: Zeile 6:
|conformance        = 5
|conformance        = 5
}}
}}
=Anschauliche Definition ([[Wolfgang Kowarschick|Kowarschick]])=
 
Ein '''Tupel''' ist eine {{Menge}} oder gar eine {{Klasse}} von unterschiedlich ''benannten Werten'', d.h. eine Menge oder Klasse von '''Schlüssel/Wert-Paaren''', wobei jeder Schlüssel nur einmal vorkommen darf.
Das [[Tupel]] ist eines der drei wichtigsten [[Container]]arten der Mathematik und Informatik:
 
{| class="wikitable"
|-
! Containerart !! Ordnung der Elemente !! Duplikate erlaubt
|-
| {{Menge}} || ungeordnet || nein
|-
| [[Multimenge]] || ungeordnet || ja
|-
| [[Tupel]] || {{iAllg}} geordnet || ja
|-
|}
 
Es gibt verschiedene Arten von ''Tupeln'' und verschiedene Repräsentationsformen. Entsprechend gibt es auch diverse Definitionen und Namen:
''Liste'', ''Familie'', ''Folge'', ''Komplex'', ''Array'', ''Hasharray'', ''tuple'', ''record'', ''sequence'', ''indexed family'', ''property list'', ''association list'', ''row'', ''array'', ''map'', ''hash map'' etc.
 
Ein Tupel ist ein [[Container]] ({{zB}} eine {{Menge}}, eine {{Klasse}} oder auch  eine Kette von  [[geordnetes Paar|geordneten Paaren]]), der
eine beliebige Anzahl von Schlüssel/Wert-Paaren enthält. Dabei darf kein Schlüssel doppelt vorkommen.
Die Klasse aller Schlüssel heißt Indexbereich.
 
Die wichtigsten Tupelarten sind:
{| class="wikitable"
|-
!  Name !! Definition !! Beispiel !! Indexbereich
|-
| Liste || Kette von Paaren ||  <math>(2, (3, (5, (7, \emptyset))))</math><br/>Abkürzung; <math>(2, 3, 5, 7)</math> || <math>\{1, 2, 3, 4\}</math> oder<br/><math>\{0, 1, 2, 3\}</math>
|-
| Familie || Menge von Paaren || <math>\{(a, 2),  (b, 3), (c, 5), (d, 7)\}</math>  || <math>\{a, b, c, d\}</math>
|-
| Assoziationsliste ||  Liste/Tupel von Paaren || <math>((a, 2),  (b, 3), (c, 5), (d, 7))</math>  || <math>\{a, b, c, d\}</math> ''und'' <br/><math>\{1, 2, 3, 4\}</math>
|}
 
Die Listendefinition hat den Nachteil, dass der Indexbereich stets endlich ist.
Üblicherweise handelt es sich dabei um ein Intervall von natürlichen Zahlen: <math>[0, n-1]</math> oder <math>[1, n]</math>.
Der Indexbereich einer Familie kann dagegen beliebig viele Elemente enthalten.
Es kann sich dabei auch um [[Komprehension|exklusive Container]] (echte {{Klasse}}n, [[Unmenge]]n) handeln,
die so viele Elemente enthalten, dass deren Mächtigkeit gar nicht definiert ist.
 
Die Familiendefinition hat dagegen den Nachteil, dass die Schlüssel/Wert-Paare
Elemente eines Containers ({{zB}} einer Klasse) sind.
Ein Container kann aber nur Individuen (einschließlich
Individuen-Container wie {{Menge}}n) als Elemente enthalten, aber keine exklusiven Container.
Das heißt, in einer Theorie, in der es exklusive Container gibt (wie {{zB}} in einer Klassentheorie),
gibt es Objekte, die nicht in Familien gespeichert werden können.
 
Auf der anderen Seite bestehen Listen {{iAllg}} nur aus Paaren. Und Paare
können so raffiniert definiert werden, dass nicht nur Individuen, sondern auch exklusive Container
darin enthalten sein können.<ref name="Schmidt Tupel"/><ref name="Glubrecht, Oberschelp, Todt (1983)">{{Quelle|Glubrecht, Oberschelp, Todt (1983)}}</ref> Das heißt, Listen können ebenfalls exklusive Container enthalten.
 
{| class="wikitable"
|-
!  Name !! Vorteil !! Nachteil
|-
| Liste<br/>Assoziationsliste|| '''Alle''' Individuen und Container<br/>als Tupel-Elemente möglich || Individuenbereich endlich
|-
| Familie ||  Individuenbereich beliebig || Exklusiver Container '''nicht'''<br/>als Tupel-Elemente möglich
|}
 
Aus Sicht des (praktischen nicht des theoretischen) Informatikers ist diese Tabelle weniger interessant, da er sowieso nur mit
endlichen Mengen arbeitet: Der Speicher ist im Gegensatz zum Speicher der Turingmaschine begrenzt.
Für ihn ist vielmehr interessant, dass im endlichen Fall jede Tupelart durch jede andere ersetzt werden kann,
da die verschiedenen Darstellungen (mehr oder minder gut) bijektiv aufeinander abgebildet werden können.
Ihm ist wichtig, die Komplexität der [[CRUD]]-Operationen (für ein Tupel: Daten einfügen, lesen, ändern und löschen)
für die einzelnen Darstellungen zu kennen, um für den jeweiligen Anwendungsfall die beste Darstellungsart wählen zu können.
== Anschauliche Definition ([[Wolfgang Kowarschick|Kowarschick]]) ==
Ein '''Tupel''' ordnet jedem Element einer {{Klasse}} (oder {{Menge}}) von '''Schlüsseln''' oder '''Attributnamen''' jeweils einen '''Wert''' zu.
Ein Tupel ist also eine Klasse von unterschiedlich benannten ''[[Attribut]]en'', {{dh}} eine Klasse von '''Schlüssel/Wert-Paaren''', wobei jeder Schlüssel nur einmal vorkommen darf.
Unterschiedlichen Schlüsseln kann jedoch durchaus derselbe Wert zugeordnet werden. Das heißt, ein Wert kann durchaus mehrfach vorkommen. Wert-Duplikate sind also erlaubt.
 
Die Klasse aller Schlüssel heißt '''Indexbereich''' oder auch – sofern es sich um eine Menge handelt – '''Indexmenge'''. Wenn auf dem Indexbereich eine [[Ordnungsrelation|totale Ordnung]] definiert ist, sind die Schlüssel/Wert-Paare des Tupels ebenfalls (bezüglich dieser Ordnungsrelation) geordnet.
Unabhängig davon, ob eine Ordnung existiert oder nicht, sind die Elemente auf jeden Fall bezüglich des Indexbereichs [[indexieren|indexiert]].


{| class="wikitable"
{| class="wikitable"
Zeile 13: Zeile 85:
! Begriff            !! Alternativnamen        !! englische Bezeichnungen
! Begriff            !! Alternativnamen        !! englische Bezeichnungen
|-
|-
| Tupel              || Familie, Folge         || tuple, indexed family, sequence
| Tupel              || Liste, Familie, Folge, Komplex<br/>Array, Assoziationsliste,<br/>Hasharray etc. || tuple, record, sequence, indexed family,<br/>property list, association list, row, array,<br/> map, hash map
|-
| Indexbereich || Definitionsbereich, Indexmenge || domain, key set
|-
|-
| Schlüssel/Wert-Paar || [[Attribut]]          || key/value pair, attribute, property
| Wertebereich || Wertemenge || value set
|-
|-
| Schlüssel          || Index, Attributname    || key, index, attribute/property name, attribute/property key
| [[Attribut]] || Schlüssel/Wert-Paar || attribute, property, key/value pair
|-
|-
| Wert                || Glied, Attributwert    || value, attribute/property value
| Attributname || Schlüssel, Index || key, index, attribute/property name,<br/>attribute/property key
|-
|-
| Attributwert || Wert, Glied || value, attribute/property value
|}
|}


==Indexmenge==
Attribute können auch mehr als einen Attributnamen haben. Diese werden dann mit Schlüssel-Schlüssel-Wert-Tripeln etc. dargestellt.


Die Menge aller Schlüssel eines Tupels wird '''Indexmenge''' des Tupels genannt.
===Indexbereich und Indexmenge===
Die Klasse aller Schlüssel eines Tupels wird '''Indexbereich''' des Tupels genannt.
Wenn es sich beim Indexbereich um eine {{Menge}} handelt, kann man auch '''Indexmenge''' sagen.


==Tupellänge==
===Tupellänge===
Die '''Länge''' eines Tupel ist gleich der [[Mächtigkeit]] der zugehörigen Indexmenge.
Die '''Länge''' eines Tupel ist gleich der [[Mächtigkeit]] des zugehörigen Indexbereichs.


Ein Tupel der Länge $n$ wird auch $n$-'''Tupel''' genannt.
Ein Tupel der Länge <math>l</math> wird auch <math>l</math>-'''Tupel''' genannt.


==Gleichheit zweier Tupel==
===Gleichheit zweier Tupel===
Zwei Tupel sind genau dann gleich, wenn die zugehörigen Indexmengen gleich sind und  
Zwei Tupel sind genau dann gleich, wenn die zugehörigen Indexbereiche gleich sind und  
wenn die jeweils gleich benannten Elemente ebenfalls gleich sind.
wenn die Werte jeweils gleich benannter Elemente ebenfalls gleich sind.


=Anmerkungen=
== Formale Definition ([[Wolfgang Kowarschick|Kowarschick]])==
Siehe [[Tupel/Formale Definition|Tupel: Formale Definition]].
 
==Anmerkungen==
Tupel sind im Prinzip nichts anderes als [[Funktion]]en, deren Definitionsbereich  
Tupel sind im Prinzip nichts anderes als [[Funktion]]en, deren Definitionsbereich  
''Indexmenge'' genannt wird. Eine [[Funktion]] ordnet jedem Element des Definitionsbreichs
''Indexbereich'' genannt wird. Eine [[Funktion]] ordnet jedem Element des Definitionsbereichs
einen Wert zu, entsprechend ordnet ein Tupel jedem Schlüssel, also jedem Element der Indexmenge einen Wert zu.
einen Wert zu, entsprechend ordnet ein Tupel jedem Schlüssel, also jedem Element des Indexbereichs einen Wert zu.


Tupel können als ''geordnete [[Multimenge]]n'',  
Tupel können auch als ''geordnete [[Multimenge]]n'',  
d.h. als ''[[Liste]]n'' aufgefasst werden (zumindest, sofern für die Elementnamen eine Ordnung definiert ist):  
{{dh}} als ''[[Liste]]n'' aufgefasst werden, sofern für den Indexbereich eine [[Ordnung]] definiert ist:  
* Elementwerte können mehrfach vorkommen (im Gegensatz zu normalen {{Menge}}n, aber in Einklang mit [[Multimenge]]n).  
* Werte können mehrfach vorkommen (im Gegensatz zu normalen {{Menge}}n, aber in Einklang mit [[Multimenge]]n).  
* Die Elemente sind gemäß den Elementnamen angeordnet (im Gegensatz zu Mengen und Multimengen).
* Die Werte sind (gemäß der auf den Schlüsseln definierten Ordnung) angeordnet (im Gegensatz zu Mengen und Multimengen).


Üblicherweise spielt allerdings die Ordnung der Tupelelemente nur dann eine Rolle (zumindest in der [[Informatik]]),
Üblicherweise spielt in der [[Informatik]] die Ordnung der Tupelelemente nur dann eine Rolle ,
wenn eine Menge von aufeinanderfolgenden ''natürlichen Zahlen'' als Indexmenge verwendet wird.
wenn als Indexbereich eine Menge von aufeinanderfolgenden ''natürlichen Zahlen'' verwendet wird.


=Beispiele=
==Beispiele==
==Beispiele in Attributnotation==
{| class = "wikitable" style = "table-layout: fixed; max-width: 48em; border: 0;"
|-
! | '''Tupelart'''
! | '''Tupelschema'''
! | '''Beispiel'''
|-
| | '''Liste'''/'''Positionstupel'''<br/>''Attributnotation''<br/>''Listennotation''<br/>''math. Notation''
| | &nbsp;<br/><code>{1: String, 2: {'f','m','d'}}</code><br/><code>(String, {'f','m','d'})</code>
| | &nbsp;<br/><code>{1: 'Anton', 2: 'm'}</code><br/><code>('Anton', 'm')</code><br/><math>(\text{Anton}, \text{m})</math>
|-
| | '''Familie'''/'''Attributtupel'''<br/>''Attributnotation''<br/>''math. Notation''
| | &nbsp;<br/><code>{name: String, sex: {'f','m','d'}}</code>
| | &nbsp;<br/><code>{name: 'Anton', sex: 'm'}</code><br/><math>\{(name,\text{Anton}), (sex,\text{m})\}</math>
|-
| | '''Assoziationsliste'''/<br/>'''Positionsattributtupel'''<br/>''Attributnotation''<br/><br/><br/>''Listennotation''<br/>''math. Notation''
| | &nbsp;<br/>&nbsp;<br/><code>{1/name: String,</code><br/><code>&nbsp;2/sex:&nbsp;&nbsp;{'f','m','d'}</code><br/><code>}</code><br/><code>(name: String, sex: {'f','m','d'})</code>
| | &nbsp;<br/>&nbsp;<br/><code>{1/name: 'Anton',</code><br/><code>&nbsp;2/sex:&nbsp;&nbsp;'m'</code><br/><code>}</code><br/><code>(name: 'Anton', sex:'m')</code><br/><math>((name,\text{Anton}), (sex,\text{m}))</math>
|}


Im Fall von endlichen Indexmengen kann ein Tupel einfach durch die explizite Angabe von Schlüssel/Wert-Paaren erfolgen.
Positionsattributtupel sind Tupel, deren Attribute zwei unterschiedliche Attributnamen haben: Eine Zeichenkette und einen Positionsbezeichner.
In der Informatik wird ein Schlüssel/Wert-Paar häufig als '''[[Attribut]]''' (''attribute'', ''property'') bezeichnet,
Dies ist die ideale Darstellung für Tupel, die durch Tabellenzeilen repräsentiert werden:
bestehend aus ''Attributnamen'' (''attribute name'', ''property name'') und
''Attributwert'' (''attribute value'', ''property value''). Daher wird folgende Notation auch '''Attributnotation''' genannt:


<div class="formula">$t_1 = \{(\text{name}, \text{Wolfgang}), (\text{geburtsjahr}, \text{1961}), (\text{hochschule}, \text{HSA})\}$</div>
{| class = "wikitable" style = "table-layout: fixed; max-width: 48em; border: 0;"
<div class="formula">$t_2 = \{(\text{name}, \text{Wolfgang}), (\text{geburtsjahr}, \text{1961}), (\text{ehefrau}, \text{Marianne})\}$</div>
|-
<div class="formula">$t_3 = \{(\text{name}, \text{Wolfgang}), (\text{geburtsjahr}, \text{1962}), (\text{hochschule}, \text{HSA})\}$</div>
! | '''name'''
<div class="formula">$t_4 = \{(\text{ehefrau}, \text{Marianne}), (\text{geburtsjahr}, \text{1961}), (\text{name}, \text{Wolfgang})\}$</div>
! | '''sex'''
<div class="formula">$t_5 = \{(\text{name}, \text{Wolfgang}), (\text{geburtsjahr}, \text{1961}), (\text{ehefrau}, \text{Marianne}), (\text{hochschule}, \text{HSA})\}$</div>
! | '''spouse'''
|-
| | <code>'Anton'</code>
| | <code>'m'</code>
| | <code>'Berta'</code>
|-
| | <code>'Berta'</code>
| | <code>'f'</code>
| | <code>'Anton'</code>
|-
| | <code>'Cäsar'</code>
| | <code>'m'</code>
| | <code>null</code>
|}
 
Jedes Attribut dieser drei Tupel hat sowohl einen Namen, der über der jeweiligen Spalte notiert wird, sowie eine Position, die sich durch die Spaltenposition ergibt.


Nur Tupel $t_2$ und $t_4$ sind gleich, alle anderen Tupel unterscheiden sich. Entweder unterscheiden sich  
In den folgenden Beispielen werden [[Attribut]]e teils mittels Attributnotation <code>a:v</code>, <code>i/a:v</code> und teils mittels
die Indexmengen ($t_1$ bis $t_4$ haben die Länge 3, Tupel $t_5$ hat dagegen die Länge 4) oder
Listennotation <math>(a,v)</math>, <math>(i,a,v)</math> dargestellt.
 
===Attributnotation===
 
Im Fall von endlichen Indexbereichen kann ein Tupel einfach durch die explizite Angabe von Schlüssel/Wert-Paaren erfolgen.
 
<source lang="javascript">
t1 = {name: 'Anton', geburtsjahr: 1961, ehefrau: 'Berta'}
t2 = {ehefrau: 'Berta', geburtsjahr: 1961, name: 'Anton'}
t3 = {name: 'Anton', geburtsjahr: 1961, hochschule: 'HSA'}
t4 = {name: 'Anton', geburtsjahr: 1962, hochschule: 'HSA'}
t5 = {name: 'Anton', geburtsjahr: 1961, ehefrau: 'Berta', hochschule: 'HSA'}
</source>
Nur Tupel <code>t1</code> und <code>t2</code> sind gleich, alle anderen Tupel unterscheiden sich. Entweder unterscheiden sich  
die Indexbereiche (<code>t1</code> bis <code>t4</code> haben die Länge 3, Tupel <code>t5</code> hat dagegen die Länge 4) oder
es stimmen nicht alle gleich benannten Elemente überein (alle übrigen Tupelpaare).
es stimmen nicht alle gleich benannten Elemente überein (alle übrigen Tupelpaare).


Folgendes ist kein Tupel (und auch keine Funktion), da zwei Elemente gleich benannt sind:
Folgendes ist kein Tupel (und damit auch keine Funktion), da zwei Elemente gleich benannt sind:
<div class="formula">$\{ (\text{name}, \text{Wolfgang}), (\text{name}, \text{Lukas}), (\text{hochschule}, \text{HSA})\}$</div>
<source lang="javascript">
{name: 'Anton', name: 'Cäsar', hochschule: 'HSA'}
</source>


====Attributnotation in der Informatik====
Die Attributnotation kommt in der Informatik häufig zum Einsatz.  
Die Attributnotation kommt in der Informatik häufig zum Einsatz.  
Beispielsweise können in [[JSON]] innerhalb einer Mengenklammer beliebig viele (jedoch nur endlich viele)
Beispielsweise können in [[JSON]] innerhalb einer Mengenklammer beliebig viele (jedoch nur endlich viele)
Attribute angeben werden. Als Attributnamen werden Zeichenketten (Strings) verwendet.
Attribute angeben werden. Als Attributnamen werden [[Zeichenkette]]n (Strings) verwendet, die mit Anführungszeichen <code>"</code> markiert sind.
Der zugehörige Attributwert wird vom Attributnamen durch einen Doppelpunkt abgetrennt.
Der zugehörige Attributwert wird vom Attributnamen durch einen Doppelpunkt abgetrennt.


<div class="formula"><code>t1 = {"name": "Wolfgang", "geburtsjahr": 1961, "hochschule": "HSA"}</code></div>
<source lang="javascript">
<div class="formula"><code>t2 = {"name": "Wolfgang", "geburtsjahr": 1961, "ehefrau": "Marianne"}</code></div>
{"name": "Anton", "geburtsjahr": 1961, "ehefrau": "Berta"}
<div class="formula"><code>t3 = {"name": "Wolfgang", "geburtsjahr": 1962, "hochschule": "HSA"}</code></div>
...
<div class="formula"><code>t4 = {"ehefrau": "Marianne", "geburtsjahr": 1961, "name": "Wolfgang", }</code></div>
</source>
<div class="formula"><code>t5 = {"name": "Wolfgang", "geburtsjahr": 1961, "ehefrau": "Marianne", "hochschule": "HSA"}</code></div>


Weitere Beispiele für Datenstrukturen, in denen Mengen von Schlüssel/Wert-Paaren zum Einsatz kommen.
Weitere Beispiele für Datenstrukturen, in denen Mengen von Schlüssel/Wert-Paaren zum Einsatz kommen:


* [[C]]/[[C++]]: Datentyp <code>struct</code> (zur Laufzeit nicht erweiter- oder kürzbar)
* [[C]]/[[C++]]: Datentyp <code>struct</code> (die Länge kann zur Laufzeit ''nicht'' verändert werden)
* [[Pascal]]: Datentyp <code>record</code> (zur Laufzeit nicht erweiter- oder kürzbar)
* [[Pascal]]: Datentyp <code>record</code> (die Länge kann zur Laufzeit ''nicht'' verändert werden)
* diverse Sprachen: [[Hashtabelle]] (auch ''hash map'', ''hash Array'', ''assoziatives Array'' etc.; zur Laufzeit erweiter- und kürzbar)
* diverse Sprachen: [[Hashtabelle]] (auch ''hash map'', ''hash array'', ''assoziatives Array'' etc.; die Länge kann zur Laufzeit verändert werden)
* [[SQL]]: Tabellenzeilen, d.h. Elemente von Relationen (zur Laufzeit durch [[Schema-Evolution]] erweiter- und kürzbar)
* [[SQL]]: Tabellenzeilen, {{dh}} Elemente von Relationen (die Länge kann zur Laufzeit durch [[Schema-Evolution]] verändert werden)
* [[JavaScript]]: [[Objekt]]e (zur Laufzeit erweiterbar oder kürzbar, sofern dies nicht explizit mittels <code>Object.freeze</code> „untersagt“ wird)
* [[JavaScript]]: [[Objekt]]e (die Länge kann zur Laufzeit verändert werden, sofern dies nicht explizit mittels <code>Object.freeze</code> „untersagt“ wird)
* [[Java]] und viele andere Sprachen: [[Objekt]]e (zur Laufzeit i. Allg. nicht erweiter- oder kürzbar)
* [[Java]] und viele andere Sprachen: [[Objekt]]e (die Länge kann zur Laufzeit {{iAllg}} ''nicht'' verändert werden)


====Attributzugriff====
Um mittels des Attributnamens auf einen Attributwert zuzugreifen, haben sich in der Informatik
Um mittels des Attributnamens auf einen Attributwert zuzugreifen, haben sich in der Informatik
zwei syntaktische Konstrukte etabliert (obwohl es durchaus noch Sprachen gibt, die andere syntaktische Konstrukte verwenden):
zwei syntaktische Konstrukte etabliert (obwohl es durchaus noch Sprachen gibt, die andere syntaktische Konstrukte verwenden):
Zeile 96: Zeile 223:
* Die Punktnotation: <code>t1.name</code>, <code>t5.ehefrau</code> etc.
* Die Punktnotation: <code>t1.name</code>, <code>t5.ehefrau</code> etc.


==Beispiele in Vektornotation==
In der Mathematik sind dagegen folgende Konstrukte üblich:
* Die Funktionsauswertung: <math>\rm{t1}(\rm{name})</math>, <math>\rm{t5}(\rm{ehefrau})</math> etc.
* Die Projektionsfunktion <math>π</math>: <math>π_{\rm{name}}(\rm{t1})</math>, <math>π_{\rm{ehefrau}}(\rm{t5})</math> etc.
* Die Indexnotation: <math>\rm{t1}_{\rm{name}}</math>, <math>\rm{t5}_{\rm{ehefrau}}</math> etc.


Für Tupel, deren Indexmenge eine Menge von $n$ aufeinanderfolgenden natürlichen Zahlen ist  
===Listennotation===
(i. Allg. $\{i: 0 < i \le n\}$, oder, wie in vielen Programmiersprachen üblich, $\{i: 0 \le i < n\}$),
 
bietet sich die in der Mathematik gebräuchliche '''[[Vektor]]notation''' an.
Für Tupel, deren Indexbereich eine Menge von <math>n</math> aufeinanderfolgenden natürlichen Zahlen ist  
Bei dieser werden die Elementnamen nicht explizit angegeben, sondern implizit durch die
({{iAllg}} <math>\{i| 0 < i \le n\}</math>, oder, wie in vielen Programmiersprachen üblich, <math>\{i| 0 \le i < n\}</math>),
bietet sich die in der Mathematik gebräuchliche Listennotation an.
Bei dieser werden die Schlüssel nicht explizit angegeben, sondern implizit durch die
Position der Elemente festgelegt:
Position der Elemente festgelegt:


<div class="formula">$t_6 = (555, 333)$</div>
<div class="formula"><math>t_6 := (555, 333)</math></div>
<div class="formula">$t_7 = (333, 555)$</div>
<div class="formula"><math>t_7 := (333, 555)</math></div>
<div class="formula">$t_8 = (555, 333, 555)$</div>
<div class="formula"><math>t_8 := (555, 333, 555)</math></div>
<div class="formula">$t_9 = (0, 2, 4, 6, 8, 10, 12, \ldots)$</div>
<div class="formula"><math>t_9 := (0, 1, 1, 2, 3, 5, 8, \ldots)</math> (Fibonacci-Zahlen)</div>


Die Tupel $t_6$ bis $t_9$ unterscheiden sich alle voneinander. In Tupel $t_6$ steht  
Die Tupel <math>t_6</math> bis <math>t_9</math> unterscheiden sich alle voneinander. In Tupel <math>t_6</math> steht  
an Position 1 das Element $555$, während in Tupel $t_7$ an Position 1 das
an Position 1 das Element <math>555</math>, während in Tupel <math>t_7</math> an Position 1 das
Element $333$ steht. Tupel $t_8$ unterscheidet sich von Tupel $t_6$ und $t_7$, da die Indexmengen
Element <math>333</math> steht. Tupel <math>t_8</math> unterscheidet sich von Tupel <math>t_6</math> und <math>t_7</math>, da die Indexbereiche
($\{1,2\}$ bei Tupel $t_6$ und $t_7$; $\{1,2,3\}$ bei Tupel $t_8$) nicht übereinstimmen.
(<math>\{1,2\}</math> bei Tupel <math>t_6</math> und <math>t_7</math>; <math>\{1,2,3\}</math> bei Tupel <math>t_8</math>) nicht übereinstimmen.


Tupel $t_6$ und $t_7$ sind $2$-Tupel, Tupel $t_8$ ist um ein Element länger,  
Tupel <math>t_6</math> und <math>t_7</math> sind 2-Tupel, Tupel <math>t_8</math> ist um ein Element länger,  
die Länge von Tupel $t_9$ beträgt ω (= abzählbar unendlich). Tupel $t_9$ ist also ein ω-Tupel.
die Länge von Tupel <math>t_9</math> beträgt ω. Tupel <math>t_9</math> enthält also abzählbar unendlich viele Elemente.
Da ein unendlich großes Tupel nicht mehr explizit angegeben werden kann, muss die Definition
Da ein unendlich großes Tupel nicht mehr explizit angegeben werden kann, muss die Definition
entweder anschaulich erfolgen (siehe obige Definition von Tupel $t_9$) oder mittels einer
entweder anschaulich erfolgen (siehe obige Definition von Tupel <math>t_9</math>) oder mittels einer
Rechenvorschrift.
Rechenvorschrift:
<div class="formula"><math>
\rm{fib(n)} := \begin{cases}
              0              & n = 0\\
              1              & n = 1\\
              \rm{fib}(n-1) + \rm{fib}(n-2) & \text{otherwise}
          \end{cases}\\
t_9 := (\rm{fib}(0), \rm{fib}(1), \rm{fib}(2), \rm{fib}(3), \ldots)\\
t_9(i) := \rm{fib}(i)
</math></div>


In [[JSON]] kommt die Vektornotation ebenfalls zu Einsatz:
====Listennotation in der Informatik====
In der Informatik, wie beispielsweise in [[JSON]], kommt die Listennotation ebenfalls zu Einsatz:


<div class="formula"><code>t6 = [555, 333]</code></div>
<source lang="javascript">
<div class="formula"><code>t7 = [333, 555]</code></div>
t6 = [555, 333]
<div class="formula"><code>t8 = [555, 333, 555]</code></div>
t7 = [333, 555]
t8 = [555, 333, 555]
</source>


Unendliche lange Tupel können in JSON nicht angegeben werden, wohl aber beispielsweise
Unendliche lange Tupel können in JSON nicht definiert werden. Allerdings ist es in JavaScript
in JavaScript mit Hilfe der Bibliothek <code>stream.js</code><ref>http://streamjs.org/</ref>,
möglich, mittels [[Generator]]en beliebig große Tupel zu generieren. Der Generator selbst kann als
die ein Element eines Streams (= Tupel) mittels [[Lazy Evaluation]] erst dann ermittelt, wenn es wirklich benötigt wird:
unendlich langes Tupel aufgefasst werden:


<source lang="javascript">
<source lang="javascript">
var nat = Stream.range(0);                       // nat = (0, 1, 2, 3, ...)
// Generator für Fibonacci-Zahlen (BigInt).
var t9  = nat.map(function(x){ return 2*x; }); // t9  = (0, 2, 4, 6, ...)  
function* fib()  
t9.take(3).print();                             // Gibt 0, 2, 4 auf der Konsole aus.
{ let a = 0n, b = 1n; // 0n = BigInt(0), 1n = BigInt(1), ...
  yield a;
  yield b;
  while (true)  
  { [a, b] = [b, a+b];
    yield b;
  }
}
 
// Hilfsfunktion zum Materialisieren der
// ersten n Elemente eines Generators.  
function take(n, p_iterable)
{ let tuple = [], i = 0;
  while (i++ < n)  
  { tuple.push(p_iterable.next().value);  }
  return tuple;
}
 
let f = fib();
console.log(f.next().value, f.next().value, f.next().value, f.next().value, f.next().value);
// -> 0n, 1n, 1n, 2n, 3n
console.log(take(1000, fib()));
// -> [0n, 1n, 1n, 2n, 3n, 5n, 8n, 13n, 21n ...] // tausend Elemente
</source>
</source>


In der Informatik finden sich weitere Datenstrukturen, in denen Elemente
In der Informatik finden sich weitere Datenstrukturen, in denen Elemente
sequenziell abgespeichert werden, d.h., in denen Tupel nicht als Menge von  
sequenziell abgespeichert werden, {{dh}}, bei denen Tupel nicht als Menge von  
Attributen, sondern als Folge von Elementen aufgefasst werden:
Attributen, sondern als Folge von Elementen aufgefasst werden:


* [[Array]]s oder Felder (häufig mit fixer Länge)
* {{Array}}s oder Felder (häufig mit fixer Länge)
* [[Liste]]n in zahlreichen Ausprägungen (i. Allg. mit variabler Länge)  
* [[Liste]]n in zahlreichen Ausprägungen ({{iAllg}} mit variabler Länge)  
* [[Stream]]s (evtl. sogar unendlich lang)
* [[Stream]]s (evtl. sogar unendlich lang)


====Attributzugriff====
Um mittels der Attributposition auf einen Attributwert zuzugreifen, hat  
Um mittels der Attributposition auf einen Attributwert zuzugreifen, hat  
sich in der Informatik ein syntaktisches Konstrukt etabliert:
sich in der Informatik ein syntaktisches Konstrukt etabliert:


* Die Indexnotation: <code>t6[1]</code>, <code>t8[2]</code> etc.  
* Die Indexnotation: <code>t[1]</code>, <code>t[2]</code> etc.  


Bei verketteten Listen, Streams etc. ist der Zugriff auf ein Element
Bei verketteten Listen, Streams etc. ist der Zugriff auf ein Element
an einer bestimmten Position dagegen manchmal nur dadurch möglich,
an einer bestimmten Position dagegen manchmal nur dadurch möglich,
dass man sich von einem Element zu nächsten „hangelt“, bis man beim
dass man sich mittels einer [[Funktion (Informatik)|Funktion]] oder [[Methode]] ({{zB}} <code>next</code>) von einem
gewünschten Element angekommen ist.
Element zu nächsten „hangelt“ ([[Traversierung]]), bis man beim
gewünschten Element angekommen ist (siehe {{zB}} die Funktion <code>take</code> im vorangegangenen Abschnitt).


=Spezielle Tupel=
In der Mathematik sind dagegen folgende Konstrukte üblich:
* Die Funktionsauswertung: <math>t(1)</math>, <math>t(2)</math> etc.
* Die Indexnotation: <math>t_1</math>, <math>t_2</math> etc.
* Die Projektionsfunktion <math>π</math>: <math>π_1(t)</math>, <math>π_2(t)</math> etc.


====Spezielle Tupel mit Positionsattributen====
{| class="wikitable"
{| class="wikitable"
|-
|-
! Länge $n$        !! Name             !! Attributnotation                     !! Vektornotation
! Länge <math>n</math> !! Name           !! Attributnotation !! Listennotation
|-
|-
| align="right" | 0 || Leeres Tupel      || $\{\}$                                 || $()$
| align="right" | 0 || Leeres Tupel      || <math>\{\}</math>                                 || <math>()</math>
|-
|-
| align="right" | 1 || Singel           || $\{(a,5)\}$                           || $(5)$
| align="right" | 1 || Single           || <math>\{(1,5)\}</math>                           || <math>(5)</math>
|-
|-
| align="right" | 2 || (geordnetes) [[geordnetes Paar|Paar]] || $\{(a,5), (b,3)\}$ || $(5,3)$
| align="right" | 2 || (geordnetes) [[geordnetes Paar|Paar]] || <math>\{(1,5),\,(2,3)\}</math> || <math>(5,\,3)</math>
|-
|-
| align="right" | 3 || Triple            || $\{(a,5), (b,3), (c,8)\}$             || $(5,3,8)$
| align="right" | 3 || Triple            || <math>\{(1,5), (2,3), (3,8)\}</math>             || <math>(5,\,3,\,8)</math>
|-
|-
| align="right" | 4 || Quadrupel        || $\{(a,5), (b,3), (c,8), (d,π)\}$       || $(5,3,8,π)$
| align="right" | 4 || Quadrupel        || <math>\{(1,5),\,(2,3),\,(3,8),\,(4,π)\}</math>       || <math>(5,\,3,\,8,\,π)</math>
|-
|-
| align="right" | 5 || Quintupel        || $\vdots$                               || $\vdots$
| align="right" | 5 || Quintupel        || <math>\vdots</math>                               || <math>\vdots</math>
|-
|-
| align="right" | 6 || Sextupel          || ||
| align="right" | 6 || Sextupel          || ||
Zeile 179: Zeile 351:
|-
|-
|- valign="top"
|- valign="top"
| align="right" | $\vdots$ || $\vdots$   || ||
| align="right" | <math>\vdots</math> || <math>\vdots</math>   || ||
|-
|-
| align="right" | 100 || Centupel        || ||
| align="right" | 100 || Centupel        || ||
|-
|-
| align="right" | $n$ || $n$-Tupel      || ||
| align="right" | n || n-Tupel      || ||
|-
|-
| align="right" | ω || ω-Tupel, Folge, Reihe, Familie || $\{(i,i^2): i \in \mathbb N\}$ || $(i^2)_{i \in \mathbb N}$
| align="right" | ω oder <math>\aleph_0</math>|| ω- oder oder <math>\aleph_0</math>-Tupel || <math>\{(i,i^2)| i \in \mathbb N\}</math> || <math>(i^2)_{i \in \mathbb N}</math>
|-
| align="right" | <math>2^{\aleph_0}</math> || <math>2^{\aleph_0}</math>-Tupel || <math>\{(r,r^2)| i \in \mathbb R\}</math> || <math>(r^2)_{r \in \mathbb R}</math>
|}
|}


=Formale Definitionen=
Jede [[endlich]]e oder [[abzählbar]] unendliche [[Folge]], [[Sequenz]] oder [[Familie]] kann als Tupel in Listennotation aufgefasst werden.
Jede (mathematische) [[Funktion (Mathematik)|Funktion]] kann als Tupel aufgefasst werden.


==Tupel in Attributnotation, Familie (in Anlehnung an Bourbaki<ref>{{Quelle|Bourbaki, N. (1939): Théorie des Ensembles}}, S. E III.45</ref> und Schmidt<ref>{{Quelle|Schmidt, J. (1966): Mengenlehre}}, S. 122</ref>)==
==Geschichte==


Es sei $t: I \rightarrow \mathcal{V}$ eine beliebige [[Funktion (Mathematik)|Funktion]] von einer {{Menge}} oder {{Klasse}} $I$ in die [[Allklasse]] $\mathcal{V}$.
===Definition „Tupel“ ([[Nicolas Bourbaki|Bourbaki]] (1939)<ref>{{Quelle|Bourbaki, N. (1939): Théorie des Ensembles}}, S. E II.7, E II.9, E IV.5</ref>)===
Die Mathematiker der Gruppe Bourbaki definieren zunächst das [[geordnetes Paar|geordnete Paar]]  ('''couple''')
nach [[Kazimierez Kuratowski]] und erwähnen, dass es das [[Paaraxiom]] erfüllt (S. E II.7):
<div class="quote">On dit que le terme <math>\{\{x\},\{x,y\}\}</math> est le '''couple formé de <math>x</math> et de <math>y</math>''', et on le note de façon abrégée <math>(x, y)</math>, de sorte que la relation <math>(x, y) = (x', y')</math> est equivalente a «<math>x = x'</math> et <math>y = y'</math>».</div>


$t$ wird nicht nur '''Funktion''' genannt, sondern, insbesondere wenn man sich mehr für den Definitionsbereich als für die Funktion selbst interessiert, 
Im Anschluss daran definieren sie das '''geordnete Tripel''' ('''triplet''') mit Hilfe zweier Paare (S. E II.9):
auch '''Tupel''' oder '''Familie''', genauer: $I$'''-Tupel''' oder $I$'''-Familie''' der Länge $n := |I|$ über $I$.
<div class="quote">... un élément <math>((x, y), z)</math> de <math>A \times B \times C</math> s'écrit aussi <math>(x, y, z)</math> et s'appelle un triplet.</div>
Sie weisen außerdem daraufhin, dass sich dies für vier und mehr Elemente verallgemeinern lässt.


<div class="formula">$TupA(t) :\leftrightarrow Fkt(t)$ (siehe [[Funktion (Mathematik)|Funktion]])</div>
Auf Seite E IV.5 führt Bourbaki den Begriff '''Tupel''' ('''multiplet''') für den Term <math>(s_1,\ldots,s_p)</math> ein und verweisen dabei explizit auf die obige Definition.


===Indexbereich und Indexmenge===
Zusammenfassung: Der Begriff '''Tupel''' ('''multiplet''') wird von Bourbaki folgendermaßen definiert:
Die Definitionsmenge $I(t) := I = \rm{Def}(f) = \{x: \exists y: (x,y) \in t\}$ der Funktion $t$ heißt
<div class="quote">
in diesem Fall '''Indexbereich''' oder, falls es sich bei $I$ um eine echte {{Menge}} und nicht um eine {{Unmenge}} handelt, '''Indexmenge'''.
<math>(x,y) := \{\{x\},\{x,y\}\}</math><br/>
Wenn <math>n \ge 3</math>, dann <math>(x_1,\ldots,x_n) := ((x_1,\ldots,x_{n-1}), x_n)</math>
</div>


===Tupellänge===
===Definition „Familie“ ([[Nicolas Bourbaki|Bourbaki]] (1939)<ref>'''[[Bourbaki (1939)]]''', S. E I.40, S. E II.13, S. E II.16</ref>)===
Die [[Mächtigkeit]] des Indexbereichs heißt '''Länge des Tupels''':
Die Mathematikergruppe Bourbaki definiert zunächst '''funktionelle Relationen''' ('''Relations fonctionelles''') als ''[[Relation]]en'' <math>R</math>, die [[rechtseindeutig]] sind (S. E I.40):
<div class="formula">$\rm{lg}(t) := |\rm{Def}(t)| = |I|$</div>
<div class="quote"><math>(\forall y)(\forall z)(((y|x)R \,\text{et}\, (z|x)R) \Rightarrow (y = z))</math></div>


===Schlüssel und Wert===
Im Anschluss an die Paardefinition (siehe vorangegangenen Abschnitt) zeigt das Mathematikerteam,
Jedes Element $i$ des Indexbereichs heißt '''Schlüssel''' oder '''Index'''.
dass jede Relation eindeutig durch eine Menge von Paaren repräsentiert wird. Diese Menge bezeichnen sie als
'''Graph''' ('''graphe''') der Relation:
<div class="quote"><math>(\exists G)(G \,\text{est un graphe et}\, (\forall x)(\forall y)(R \Leftrightarrow ((x, y) \in G)))</math>


Das zum Index $i$ gehörende Element $t_i := t(i)$ wird als '''Wert''' bezeichnet.
Le graphe <math>G</math> est alors unique en vertu de l'axiome d'extensionalite, et s'appelle le '''graphe de <math>R</math>'''</div>


===Anmerkungen===
Anschließend definieren sie die eigentlichen  '''[[Funktion]]en''' ('''fonctions''') als ''funktionelle Relationen'' mit
[[Definitionsbereich]] <math>A</math> und [[Wertebereiche]] <math>B</math> (S. E II.13):
<div class="quote">Autrement dit, une correspondance <math>f = (F, A, B)</math> est une fonction si, pour taut <math>x</math> appartenant à l' ensenzble de départ <math>A</math> de <math>f</math>, la relation <math>(x,y) \in F</math> est fonctionnelle en <math>y</math> (I, p. 41);</div>


Mit $Fkt(f)$ wird ausgedrückt, dass es sich bei einer Menge oder Klasse $f$ um eine Funktion handelt, dass $f$ also eine Menge oder Klasse von  
<math>F</math> ist als Graph der Funktion eine Menge von Paaren. Dies ist die typische mengentheoretische Definition des Funktionsbegriffs.
[[geordnetes Paar|geordneten Paaren]] ist, die die Eindeutigkeitsbedingung


{{Formel|\forall x, y_1, y_2: [x,y_1] \in f \wedge [x,y_2] \in f \rightarrow y_1{{=}}y_2}}
Zu guter Letzt führt die Gruppe den Begriff '''Familie''' als Alternative für den Begriff '''Funktion''' ein (S. E II. 16):
erfüllt.
<div class="quote">Si <math>f</math> est une application de <math>A</math> dans <math>B</math>, la fonction <math>f</math> est égale à la fonction <math>x \rightarrow f(x) (x \in A, f(x) \in B)</math>, qu'on écrit sirnplement <math>x \rightarrow f(x)</math>, ou aussi <math>(f_x)_{x \in A}</math> c'est surtout quand on utilise la dernière notation qu'on parle de « famille d'éléments » au lieu de « fonction ».</div>


Mit $TupA(t)$ wird ausgedrückt, dass es sich bei $t$ um ein Tupel in Attributnotation handelt.
Die Begriffe ''Familie'' und ''Funktion'' unterscheiden sich nur syntaktisch. Die Syntax
<math>(f_x)_{x \in A}</math> wurde in Anlehnung an die Tupelsyntax gewählt und betont damit die
Verwandtschaft zwischen diesen beiden Begriffen.
Der Begriff ''Familie'' kann also als Alternative für den Begriff ''Tupel'' aufgefasst werden.
Diese Definition hat den Vorteil, dass auch leere, einelementige und nicht-endliche Indexbereiche unterstützt werden.


Schmidt verwendet die Bezeichnung „''Glied''“ an Stelle von „''Wert''“.
===Definition „Tupel“ ([[Kurt Gödel|Gödel]] (1940)<ref>{{Quelle|Gödel (1940)}}, S. 4</ref>)===
<div class="quote">
Dfn <math><x\,y> = \{\{x\}\{x\,y\}\}</math><br/>
Dfn <math><x_1\,\ldots\,x_n> = <x_1\,<x_2\,\ldots\,x_{n}>></math> [Anm. WK: wobei <math>n \ge 3</math>]<br/>
Dfn <math><x> = x</math>
</div>


Der Begriff  „$I$-Tupel“ geht auf Ebbinghaus<ref name="Ebbinghaus">{{Quelle|Ebbinghaus, H.-D. (2003): Einführung in die Mengenlehre}}, S. 59–60</ref> zurück.
Wegen der Rechtsassoziativität gilt folgender Satz (wie man laut Gödel per Induktion nachweist):
<div class="quote">
<math><x_1\,\ldots\,x_n\,<x_{n+1}\ldots x_{n+p}>> = <x_1\,\ldots\,x_{n}\,x_{n+1}\,\ldots\,x_{n+p}></math>
</div>


==Tupel in Vektornotation (in Anlehnung an McCarthy et al.<ref name="McCarthy (1965)">{{Quelle|McCarthy, J. et. al. (1965): LISP 1.5 Programmer's Manual}}</ref>)==
'''Anmerkung:'''<br/>
Diese Definition unterschiedet sich nicht wesentlich von der oben angeführten [[Tupel#Definition_.E2.80.9ETupel.E2.80.9C_.28Bourbaki_.281939.29.5B1.5D.29|Tupel-Definition der Mathematikergruppe Bourbaki]]: Die Klammerung ist rechts- an Stelle von linksassoziativ und das einelementige Tupel wurde als Spezialfall ergänzt.


Der von [[Giuseppe Peano|Peano]] eingeführte [[geordnetes Paar]]-Begriff kann induktiv für eine beliebige endliche Anzahl von Elementen verallgemeinert werden:
===Definition „List“ ([[John McCarthy|McCarthy]] (1960)<ref name="McCarthy (1960)">{{Quelle|McCarthy (1960)}}, S. 187</ref>)===
<div class="quote">
S-expressions are then defined as follows:
# Atomic symbols are S-expressions.
# If <math>e_1</math> and <math>e_2</math> are S-expressions, so is <math>(e_1 \cdot e_2)</math>.
...


Eine Menge oder Klasse $t$ heißt '''Tupel''' (in Vektornotation) – in Zeichen $\rm{TupV}(t)$ – wenn entweder $t=\emptyset$ gilt
An S-expression is then simply an ordered pair, the terms of which may be atomic symbols or simpler S-expressions. We can represent a list of arbitrary length in terms of S-expressions as follows. The list
oder wenn $t$ ein [[geordnetes Paar]] $[x,t]$ ist, dessen erstes Element beliebig und dessen zweites Element ein Tupel ist:
<div class="formula"><math>(m_1, m_2, \cdots, m_n)</math></div>
is represented by the S-expression
<div class="formula"><math>(m_1 \cdot (m_2 \cdot (\cdots (m_n \cdot \text{NIL}) \cdots )))</math></div>
Here <math>\text{NIL}</math> is an atomic symbol used to terminate lists.
</div>


<div class="formula">$\rm{TupV}(\emptyset)$ </div>
'''Anmerkung''':<br/>
<div class="formula">$\forall x, t: \rm{TupV}(t) \rightarrow \rm{TupV}([x,t])$</div>
McCarthy erwähnt, dass es auch einelementige Listen gibt: <math>(m) = (m \cdot \text{NIL})</math>. Im Gegensatz zur Definition von Gödel unterscheiden sich einelementige Tupel von ihren Elementen; <math>e \ne (e)</math>. Bei Gödel gilt dagegen <math>e = <e></math>. Mehr noch, es gibt nun auch Tupel der Länge 0. Dies wurde McCarthy allerdings erst später klar. In seiner Definition von LISP 1.5 definiert er das leere Tupel explizit: <math>() := NIL</math> (siehe nächsten Abschnitt).


Andere Tupel in Vektornotation gibt es nicht.
===Definition „List“ ([[John McCarthy|McCarthy]] et al. (1965)<ref name="McCarthy (1965)">{{Quelle|McCarthy et. al. (1965)}}, S. 2, S. 4</ref>)===
Das heißt, für jedes Tupel $t \not= \emptyset$ gibt es ein Element $x$ <br/>und ein Tupel $t'$ mit $t = [x,t']$:
Seite 2:<div class="quote">
<div class="formula">$\forall t: (\rm{TupV}(t) \wedge t \not= \emptyset \rightarrow \exists x, t': (\rm{TupV}(t') \wedge t = [x,t']))$</div>
An S-expression is either an atomic symbol or it is composed of these elements in the following order: a left parenthesis, an S-expression, a dot, an S-expression, and a right parenthesis.


Das Tupel $t'$ ist wegen des [[geordnetes Paar|Paaraxioms]] sogar eindeutig bestimmt:
Notice that this definition is recursive.
<div class="formula">$\forall t: (\rm{TupV}(t)  \;\rightarrow\; \forall x_1, x_2, t_1, t_2: (\rm{TupV}(t_1) \wedge \rm{TupV}(t_2) \wedge t = [x_1,t_1] \wedge t = [x_2,t_2] \,\rightarrow\, t_1=t_2 \wedge x_1=x_2))$</div>
</div>


In einem klassenbasierten Axiomen-System (wie es z.B. der [[Neumann-Bernays-Gödel-Mengenlehre]] zu Grunde liegt)
Seite 4:<div class="quote">
ist die Formel allerdings nur im Falle von [[geordnetes Paar|Klassenpaare]] gültig (vgl [[geordnetes Paar#Reihenfolge der Elemente|Abschnitt „Reihenfolge der Elemente“]] im Artikel [[geordnetes Paar]]).
Any S-expression can be expressed in terms of the dot notation. However, LISP has an
Für [[geordnetes Paar|Mengenpaare]] müsste sie entsprechend eingeschränkt werden.
alternative form of S-expression called the list notation. The list (m₁ m₂  . . . mₙ) can be
defined in terms of dot notation. It is identical to (m₁ . (m₂  . ( . . . . (mₙ . NIL). . . ))).


===Tupellänge===
The atomic symbol NIL serves as a terminator for lists. The null list ( ) is identical
to NIL.
</div>


Es sei $t$ ein Tupel in Vektornotation: $TupV(t)$.
===Definition „Property List“ ([[John McCarthy|McCarthy]] et al. (1965)<ref>'''[[McCarthy et. al. (1965)]]''', S. 39, S. 58</ref>)===
Die Länge $\rm{lg}(t)$ von $t$ wird ebenfalls induktiv definiert:


<div class="formula">$\rm{lg}(\emptyset) := 0$ </div>
Seite 39:
<div class="formula">$\forall x, t: \rm{TupV}(t) \rightarrow \rm{lg}([x,t]) := \rm{lg}(t)+1$</div>


Ein Tupel der Länge $n$ heißt '''$n$-Tupel in Vektornotation'''.
In LISP 1.5 wird eine (interne) Datenstruktur '''property list''' definiert, die dazu verwendet wird,
atomaren Symbolen eine ganze Liste von '''Eigenschaften''' ('''properties''') zuzuordnen.
Dabei wird jede ''Eigenschaft'' (''property'') von einem atomaren Symbol eingeleitet, welches
'''Indikator''' (''indicator'') genannt wird.


Das $0$-Tupel wird auch '''leeres Tupel''' genannt.
Seite 58:


====Lemma====
In LISP 1.5 gibt es eine Pseudofunktion „define“, um atomaren Symbolen Properties zuzuordnen:
 
<div class="quote>
Die Länge eines Tupels in Vektornotation ist eindeutig bestimmt.
The argument of <u>define</u>, x, is a list of pairs
 
<div class="formula">((u₁ v₁) (u₂ v₂) ... (uₙ vₙ))</div>  
'''Beweis'''
where each u is a name and each v is a λ-expression for a function. For each pair, <u>define</u> puts an EXPR on the property list for u pointing to v. The function of <u>define</u> puts things on at the front of the property list.
 
Das leere Tupel ist das einzige Tupel der Länge $0$.
Für jedes andere Tupel $t$ existiert genau ein Element $x$ und ein Tupel $t'$, für die $t=[x,t']$ gilt.
Für $t'$ ist die Länge laut Induktionsvoraussetzung eindeutig bestimmt und damit ist die Länge $\rm{lg}(t) = \rm{lg}(t')+1$
ebenfalls eindeutig bestimmt.
 
===Indexmenge===
 
Für ein Tupel $t$ in Vektornotation wird die '''Indexmenge''' $I(t)$ folgendermaßen definiert:
<div class="formula">$I(t) := \{i \in \mathbb{N}: 0 < i \le \rm{lg}(t)\}$</div>
 
===Schlüssel und Wert===
 
Es seien $t$ ein nicht-leeres Tupel in Vektornotation und $I := I(t)$ die zugehörige Indexmenge.
Die Elemente $i\in I$ der Indexmenge heißen '''Schlüssel'''.  
 
Jedem Schlüssel $i\in I$ wird durch das
Tupel $t$ ein eindeutiger '''Wert''' $t_i$ zugeordnet. $t_i$ wird wieder induktiv definiert:
 
Da laut Voraussetzung $t \not= \emptyset$ gilt, gibt es zwei (eindeutige) Elemente
$x$ und $t'$ mit $\rm{TupV}(t')$ und $t=[x,t']$.
<div class="formula">$t_i :=
  \begin{cases}
    x        & \mbox{wenn } i = 1\\
    t'_{i-1} & \mbox{wenn } i > 1
  \end{cases}$
</div>
</div>


Man beachte, dass aus $i\in I$ stets $0 < i < \rm{lg}(t)$ folgt.
McCarthy hat in LISP 1.5 also neben den normalen Listen auch Assoziationslisten eingeführt (und diese ''property lists'' genannt).
Diese [[Invariante]] bleibt im rekursiven Zweig der Definition
erhalten: $i>1 \rightarrow 0 < i-1 < \rm{lg}(t)-1 = \rm{lg}(t')$
Das heißt, es gilt auch hier $i-1 \in I(t')$.


Für $i\notin I$ ist $t_i$ nicht definiert. Man kann in diesem Fall allerdings
===Common Lisp===
$t_i := \mathcal{V}$ setzen, um $t_i$ für jede beliebige Klasse $i$ zu definieren.


===Vektornotation===
In Common List gibt es neben den von McCarthy eingeführten Listen zusätzlich sogar zwei Arten von Assoziationslisten: “association lists” und “property lists”.


Für Tupel in Vektornotation wird Folgende abkürzende Schreibweise eingeführt:
====Definition “Association List”  ([[Steele (1990)]], S431<ref>{{Quelle|Steele (1990)}}, S. 431, https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153.html</ref>)====


<div class="formula">$() := \emptyset$</div>
<i>An '''association list''', or '''a-list''', is a data structure used very frequently in Lisp. An a-list is a list of pairs (conses); each pair is an association. The '''car''' of a pair is called the '''key''', and the '''cdr''' is called the '''datum'''.</i>
<div class="formula">$(x_1) := [x_1, \emptyset]$</div>
<div class="formula">$(x_1,x_2) := [x_1, [x_2, \emptyset]]$</div>
<div class="formula">$(x_1,x_2,x_3) := [x_1, [x_2, [x_3, \emptyset]]]$</div>


Allgemein für $n \ge 1$:
'''Übersetzung (W. Kowarschick):'''<br>
<div class="formula">$(x_1,\ldots,x_n) :=  [x_1,(x_2,\ldots,x_n)] = [x_1, [x_2, [\ldots [x_n, \emptyset] \ldots ]]]$</div>
<i>Eine '''Assoziationsliste''' oder '''A-Liste''' ist eine Datenstruktur, die in Lisp sehr oft benutzt wird. Eine A-Liste ist eine Liste von Paaren (Cons-Zellen); jedes Paar ist eine Assoziation. Das car-Element [WK: das erste Element] eines Paares wird '''Schlüssel''' genannt und das cdr-Element [WK: das zweite Element] wird '''Datum''' genannt.</i>


====Anmerkungen====
====Definition “Property List” ([[Steele (1990)]], S. 238 – 239<ref>[[Steele (1990)]], S .238 – 239, https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node108.html</ref>)====
=====Ursprung und Varianten der Vektornotation=====
<i>Since its inception, Lisp has associated with each symbol a kind of tabular data structure called a '''property list''' ('''plist''' for short). A property list contains zero or more entries; each entry associates with a key (called the '''indicator'''), which is typically a symbol, an arbitrary Lisp object (called the '''value''' or, sometimes, the '''property'''). There are no duplications among the indicators; a property list may only have one property at a time with a given name. In this way, given a symbol and an indicator (another symbol), an associated value can be retrieved.</i>
Die obige Definition der Vektornotation geht auf McCarthy zurück:
{{Quote|The list $(m_1,m_2,···,m_n)$ is represented by the S-expression $(m_1·(m_2·(···(m_n·\rm{NIL})···)))$.<br/>
Here $\rm{NIL}$ is an atomic symbol used to terminate lists.<ref>{{Quelle|McCarthy, J. (1960): Recursive Functions of Symbolic Expressions and Their Computation by Machine}}</ref>}}


McCarthy definert eine [[LISP]]-Liste als abkürzende Schreibweise für eine Folge von $cons$-Zellen, d.h. als Folge von LISP-Paaren $(a \cdot b)$.  
<i>A property list is very similar in purpose to an association list. The difference is that a property list is an object with a unique identity; the operations for adding and removing property-list entries are destructive operations that alter the property list rather than making a new one. Association lists, on the other hand, are normally augmented non-destructively (without side effects) by adding new entries to the front (see <code>acons</code> and <code>pairlis</code>).</i>
In LISP wird eine Liste also als [[verkette Liste]] implementiert: Jede $cons$-Zelle enthält das eigentlich Listenelement sowie einen Verweis auf die Nachfolgerliste.
Die letzte $cons$-Zelle enthält keinen Verweis, sondern die LISP-Konstante $\rm{NIL}$.  


In seinen ursprünglichen Publikationen wie auch im Benutzerhandbuch von LISP I<ref>{{Quelle|McCarthy, J. et. al. (1960): LISP I Programmer's Manual}}, S. 11</ref>
'''Übersetzung (W. Kowarschick):'''<br>
bezeichnet McCarthy $\rm{NIL}$ lediglich als „atomares Symbol“, welches benutzt wird, um Listen zu terminieren. Erst im Beutzerhandbuch von
<i>Von Anfang an wurde in Lisp jedes Symbol mit einer Art tabellenartiger Datenstruktur verknüpft, die '''Propertyliste''' [WK: '''Eigenschaftsliste'''] genannt wird (kurz '''P-Liste''').  
LISP 1.5<ref name="McCarthy (1965)"/> legt er zusätzlich
Eine Propertyliste enthält null oder mehr Einträge: Jeder Eintrag verknüpft einen Schlüssel ('''Indikator''' genannt), welcher typischerweise ein Symbol ist, mit einem beliebigen Lisp-Objekt ('''Wert''' genannt oder manchmal auch '''Property''' [WK: '''Eigenschaft''']). Unter den Indikatoren gibt es keine Duplikate; eine Propertyliste kann zu jedem Zeitpunkt nur eine Eigenschaft mit einem gegebenen Namen haben. Auf diese Art kann für ein gegebenes Symbol und einen gegebenen Indikator (ein anderes Symbol) auf einen [WK: mit dem Symbol] verknüpften Wert zugegriffen werden.</i>
fest, dass $\rm{NIL}$ identisch zur leeren Liste $()$ ist.


Die Definition von McCarthy ist den Defintionen von anderen Autoren, wie z.B. [[Kurt Gödel|Gödel]] oder Schmidt, vorzuziehen.  
<i>Der Zweck einer Propertyliste ist dem einer Assoziationsliste sehr ähnlich. Der Unterschied ist, dass eine Propertyliste ein Objekt mit einer eindeutigen Identität ist; die Operationen zum Hinzufügen und Löschen von Propertylisten-Einträgen sind destruktive Operationen, die die Propertyliste verändern anstatt eine neue zu erstellen. Assoziationslisten werden demgegenüber nicht-destruktiv erweitert (ohne Seiteneffekte), indem neue Einträge vorne hinzugefügt werden
(vgl. <code>acons</code> und <code>pairlis</code>).</i>


'''Definition von Schmidt (und diversen anderen Autoren):'''
===Definition „Tupel“  ([[Jürgen Schmidt|Schmidt]] (1966)<ref name="Schmidt Tupel">{{Quelle|Schmidt (1966)}}, S. 100</ref>)===
<div class="formula">$(x_1, x_2)$ ist ein (Klassen-)Paar.</div>
Schmidt definiert Tripel, Quadrupel ..., <math>n</math>-Tupel genauso wie Bourbaki (siehe oben). Allerdings verwendet er eine
<div class="formula">$(x1, x2, x3) := ((x1, x2), x3)$ ist ein (Klassen-)Tripel.</div>
[[Geordnetes Paar#Schmidt_.281966.29.5B9.5D|eigene Definition des geordneten Paare]]s, die auch echte {{Klasse}}n zulässt:
<div class="formula">$(x1, x2, x3, x4) := ((x1, x2, x3), x4) = (((x1, x2), x3), x4)$ ist ein (Klassen-)Quadrupel.</div>
<div class="quote">
<math>(x,y) := \{\,\{\{x\}\}: x \in a\,\} \,\cup\, \{\,\{\emptyset, \{x\}\}: x \in b\,\}</math><br/>
Wenn <math>n \ge 3</math>, dann <math>(x_1,\ldots,x_n) := ((x_1,\ldots,x_{n-1}), x_n)</math>
</div>


Diese Definition hat zwei Nachteile:  
'''Anmerkung:'''<br/>
* Es gibt kein $0$- und keine $1$-Tupel.
Damit ist es  {{zB}} möglich, das [[Monoid]] <math>(\Omega, +, *)</math> der [[Ordinalzahlen]] <math>\Omega</math>, auf denen eine Addition und eine Multiplikation definiert ist<ref>{{Quelle|Cantor (1897)}}</ref>, als Tupel zu definieren. Die Klasse der Ordinalzahlen <math>\Omega</math> ist eine [[Unmenge]], wie schon Burali-Forti und Cantor gezeigt haben<ref>{{Quelle|Burali-Forti (1897)}}</ref><ref>{{Quelle|Cantor (1899)}}</ref>.
* Tupel unterschiedlicher Länge können gleich sein (jedes $n$-Tupel für $n>2$ ist gleich einem $2$-Tupel; ein Beweis einer Aussage analog zu Lemma 5.3.1.1 scheitert daher beim Induktionsanfang).


'''Definition von Gödel (und diversen anderen Autoren):'''
===Definition „Familie“  ([[Jürgen Schmidt|Schmidt]] (1966)<ref>'''[[Schmidt (1966)]]''', S. 119, S. 120, S. 122</ref>)===


Gödel<ref>{{Quelle|Gödel, K. (1940): The Consistency Continuum Hypothesis}}</ref> hat Tupel im Prinzip genauso wie Schmidt definert.
Schmidt definiert [[Funktion]]en <math>f</math> als [[Relation]] ({{dh}} als Teilklasse von <math>\mathcal{V} \times \mathcal{V}</math>), die folgende
Zusätzlich hat er allerdings noch $1$-Tupel eingeführt:
Eindeutigkeitsbedingung erfüllt (S. 119):
<div class="formula">$(x_1) := x_1$</div>
<div class="quote"><math>\bigwedge x \bigwedge y \bigwedge z ((x,y) \in f \wedge (x,z) \in f \Rightarrow y=z)</math></div>


Doch auch diese zusätzliche Festlegung löst die obigen Probleme nicht wirklich.
Den Wert der Funktion <math>f</math> an der Stelle <math>x</math> berechnet er folgendermaßen:
<div class="quote"><math>f(x) := \bigcap\{y|(x,y) \in f\}</math></div>


=====Mengentupel und Klassentupel=====
Das heißt, eine Funktion ist eine Klasse von geordneten Paaren (wobei die Paare selbst nur Mengen als Elemente enthalten können), bei denen kein
Element des Definitionsbereichs doppelt vorkommt.


In einer klassenbasierten Mengenlehre erhält man mit Hilfe der obigen Definition so  genannte '''Klassentupel''',
Er führt dann (S. 122) den Begriff '''Familie''' oder '''Folge''' als Synonym für den Begriff ''Funktion'' ein. Den ''Definitionsbereich''
sofern man der Definition der Tupel Klassenpaare zugrunde legt.
nennt er in diesem Fall '''Indexbereich'''. Ein Element eines Indexbereichs heißt '''Index'''. An Stelle der Schreibweise <math>f(x)</math>
Bei Benutzung einer mengenbasierten Mengenlehre oder wenn man Tupel mit Hilfe von Mengenpaaren definiert,
verwendet er die Indexschreibweise <math>f_x</math>.
erhält man dagegen lediglich so genannte '''Mengentupel'''.


Ein Klassentupel kann nicht nur Mengen, sondern auch Unmengen als Elemente beinhalten.
'''Anmerkungen:'''<br/>
Im Prinzip unterscheidet sich diese Definition nicht wesentlich von der
[[Tupel#Definition_.E2.80.9EFamilie.E2.80.9C_.28Bourbaki_.281939.29.5B2.5D.29|Definition von Bourbaki]].
Schmidt unterscheidet allerdings nicht zwischen Funktion und Funktionsgraph. Außerdem ist sein Funktionsbegriff in der Hinsicht allgemeiner,
dass eine Funktion nicht notwendigerweise eine {{Menge}} von Paaren ist, sondern auch eine echte {{Klasse}} von Paaren sein kann.


Beispielsweise kann man das [[Monoid]] der [[Ordinalzahlen]] $\Omega$ mit Addition $+$ und neutralem Element $0$ als Klassentupel $(\Omega,+,0)$ definieren, obwohl es sich bei $\Omega$ um eine Unmenge handelt.
Auf der einen Seite ist der Begriff Schmidt-Familie universeller als der Begriff Schmidt-Tupel, da der Indexbereich auch leer, einelementig und beliebig groß sein kann.
Für Mengentupel gilt dagegen, dass $(\Omega,+,0)$ entweder nicht definiert ist oder gleich der Allklasse $\mathcal{V}$ ist. Im letzteren Fall sind alle Mengentupel, die ein oder mehrere Unmengen enthalten, ebenfalls
Auf der anderen Seite ist der Begriff Schmidt-Tupel universeller als der Begriff Schmidt-Familie, da ein Tupel auch echte Klassen als Elemente enthalten kann.
gleich $\mathcal{V}$.


=====Objektsprache und Metasprache=====
===Definition „Tupel“ ([[Heinz-Dieter Ebbinghaus|Ebbinghaus]] (2003)<ref>{{Quelle|Ebbinghaus (2003)}}, S. 59 – 60</ref>)===
Man beachte auch, dass hinsichtlich der Definitionen und Beweise ein wesentlicher Unterschied zwischen
Ebbinghaus definiert zunächst das [[geordnetes Paar|geordnete Paar]]
Mengen- und Klassentupeln besteht.
<div class="quote"><math>(x,y) := \{\{x\},\{x,y\}\}</math></div>
nach [[Kazimierez Kuratowski]] und verallgemeinert es dann für beliebige <math>n</math>-Tupel
(<math>n \ge 1</math>):
<div class="quote">
(i) <math>(x) := x</math><br/>
(ii) Für <math>n \ge 1</math> sei <math>(x_0,\ldots,x_n) := ((x_0,\ldots,x_{n-1}), x_n)</math>
</div>


Für Mengen kann $TupV$ als echte [[Funktion (Mathematik)|Funktion]] definiert werden. Die zugehörigen, auf [[vollständige Induktion|vollständiger Induktion]] basierenden Beweise
Er formuliert den folgenden Satz:
können daher innerhalb der formalen Sprache ([[Metasprache|Objektsprache]]) des jeweiligen Axiomensystems der Mengenlehre (unter Zuhilfenahme des [[Unendlichkeitaxiom]]s) durchgeführt werden. In einem ersten
<div class="quote"><math>(x_0,\ldots,x_n) = (y_0,\ldots,y_n) \leftrightarrow x_0 = y_0 \wedge \ldots \wedge x_n = y_n</math></div>
Schritt formalisiert man innerhalb der Mengenlehre die natürlich Zahlen (samt vollständiger Induktion) und in einem zweiten Schritt wendet man diesen Formalismus bei
Einen Beweis gibt er nicht an, da sich dieser leicht ''durch metaprachliche Induktion'' ergäbe.
den Beweisen der obigen Aussagen an.  


Für Klassen kann $TupV$ dagegen nicht als echte Funktion, sondern nur als Abkürzung, definiert werden,
'''Anmerkung:'''<br/>
da eine Unmenge niemals in einer Funktion als Urbild oder Bildelement auftauchen kann.
Diese Definition unterscheidet sich nicht von der Definition der Mathematikergruppe Bourbaki (siehe oben). Es wurde lediglich das einelementige Tupel als Spezialfall ergänzt, in derselben Weise, wie dies Gödel vorgeschlagen hat (siehe oben).
Es gilt nämlich
{{Formel|\rm{UMg}(a) \rightarrow \{a\}{{=}} \mathcal{V}|([[Schmidt (1966)]], S. 73)}}
und damit auch
{{Formel|\rm{UMg}(a) \vee  \rm{UMg}(b) \rightarrow \rm{UMg}((a,b))|([[Schmidt (1966)]], S. 97)}}
{{Formel|\rightarrow \{\ldots,(a,b),\ldots\}{{=}} \mathcal{V} }}
Das heißt, sobald man versucht, eine Unmenge in die Definition einer Funktion $f$ als Urbild oder Bildelement einzuschleusen, degeneriert $f$ zur Allklasse.
 
$TupV(t)$ ist also im Falle von Klassentupeln eine Abkürzung für eine mengentheoretische Formel, genauso wie $Mg(m)$, als Abkürzung für die Formel $\exists a: m \in a$ steht (siehe {{Klasse}}).  
Die zugehörigen Induktionsbeweise müssen in diesem Fall außerhalb des Axiomensystems der Mengenlehre auf geführt werden,
also beispielsweise mit Hilfe der [[Metasprache]], die zur Definition des formalen System verwendet wurde.
Man beachte, dass die obigen Beweise genau sogar innerhalb der [[Metasprache#Metametasprache|Metametasprache]] „Deutsch“ geführt wurden.
 
Das Problem ist, dass man, obwohl man eine Arithmetik der natürlichen Zahlen formal mit Hilfe der Mengenlehre-Axiome
– d.h. innerhalb der Objektsprache – definieren kann, dennoch eine Arithmetik außerhalb – d.h. innerhalb der Metasprache –
des Systems braucht, um das formale System überhaupt definieren zu können.
Metamatematische Induktionsbeweise beruhen auf „gesundem Menschenverstand“. Im Prinzip definiert man ein Beweisschema,
aus dem man für jeden konkreten Einzelfall einen formalen Beweis ableiten kann. Dies war schon Gödel bekannt: 
{{Quote|... einziger Zweck dieser allgemeinen metamathematischen Überlegungen ist es zu zeigen,  
wie die Beweise für Sätze von einem gewissen Typus nach einer allgemeinen Methode ausgeführt werden können;
... diese allgemeinen metamathematischen Überlegungen könnten ganz wegbleiben, wenn man sich die Mühe nähme,
die Beweise in jedem Fall einzeln durchzuführen ...<ref>zitiert nach [[Schmidt (1966)]], S. 174</ref>
}}
 
===Abbildung der Vektor- auf die Attributnotation===
 
Für jedes $n$-Tupel $t = (x_1,\ldots,x_n)$ in Vektornotation kann ein zugehöriges Tupel $t'$ in Attributnotation definiert werden,
sofern es sich bei $t$ um ein „Mengentupel“ handelt, d.h. sofern das Tupel nur {{Menge}}n aber keine {{Unmenge}}n enthält, d.h., sofern $\rm{Mg}(x_1),\ldots,\rm{Mg}(x_n)$:
 
<div class="formula">$t' := \{[i,t_i]: i \in I(t)\}$</div>
 
====Lemma====
 
$t$ und $t'$ beschreiben dasselbe Tupel:
 
<div class="formula">$I(t) = I(t') =: I$</div>
<div class="formula">$\rm{lg}(t) = \rm{lg}(t')$</div>
<div class="formula">$\forall i \in I: t_i = t'_i$</div>
 
'''Beweis'''


===Definition „Familie“ ([[Heinz-Dieter Ebbinghaus|Ebbinghaus]] (2003)<ref>'''[[Ebbinghaus (2003)]]''', S. 55, S. 59 – 60</ref>)===
{{TBD}}
{{TBD}}


===Anmerkungen===
==Quellen==
 
Ein geordnetes Paar $[a,b]$ kann, wie bereits definiert wurde, als 2-Tupel aufgefasst werden.
 
Allerdings liefert die allgemeine Tupeldefinition, die i.Allg. auf dem geordneten Paar basiert,
ihrerseits ein 2-Tupel, das heißt, ein geordnetes Paar: $(a,b)$. Da dieses Paar ebenfalls das Paaraxiom erfüllt,
wird das spezielle geordnete Paar  $[a,b]$ künftig nicht mehr benötigt. Es wird durch $(a,b)$ ersetzt.
 
{{TBD}}
 
==Lemma==
 
Die Indexmenge $I(t)$ eines $n$-Tupels  $t = (x_1,\ldots,x_n)$ ist gleich $\{1,\ldots,n\}$ und die Länge beträgt $n$.
 
'''Beweis''': durch vollständige Induktion
 
<div class="formula">$n=0: I(t) = \rm{Def}(t') = \emptyset \quad\rightarrow\quad \rm{lg}(t) = |I(t)| = |\emptyset| = 0$</div>
<div class="formula">$n>0: I(t) = \rm{Def}(t') = \rm{Def}((x_1,\ldots,x_{n-1})') \cup  \rm{Def}(\{(n, x_n)\}) = \{1,\ldots,n-1\} \cup \{n\} =  \{1,\ldots,n\} \quad\rightarrow\quad \rm{lg}(t) = |I(t)| = (n-1)+1 = n$</div>
 
=Gleichheit zweier Tupel=
Die Gleichheit von Tupel wird – unabhängig von der Art der Definition – auf die Gleichheit von Klassen zurückgeführt:
 
Zwei Tupel $t_1$ und $t_2$ sind genau dann gleich, wenn $t_1$ und $t_2$ als {{Klasse}}n gleich sind,
d.h., wenn:
<div class="formula">$t_1 \subseteq t_2 \wedge t_2 \subseteq t_1$</div>
oder, anders fomuliert:
<div class="formula">$\forall x \in \mathcal{V}: x \in t_1 \Leftrightarrow x \in t_2$</div>
 
===Lemma===
Zwei gleiche gleiche Tupel (in Attribut- oder Vektornotation) sind trivialerweise gleichlang:
 
<div class="formula">$t_1 = t_2 \Rightarrow \text{lg}(t_1) = \text{lg}(t_2)$</div>
 
'''Beweis'''
 
Die Behauptung folgt direkt aus der [[Reflexivität]] der Gleichheit ($\text{lg}(t_1) = \text{lg}(t_1)$)
und der [[Leipnizsche Ersetztbarkeit|Leibnitzschen Ersetzbarkeit]]<ref>[[Wikipedia:Identität_(Logik)]]</ref>,
die aussagt, das in Formeln ein Element stets durch ein dazu gleiches Element ersetzt werden kann.
 
===Satz===
Es seien $t_1$ und $t_2$ zwei Tupel (in Attribut- oder Vektornotation).
 
$t_1$ und $t_2$ sind genau dann gleich, wenn die zugehörigen Indexmengen $I(t_1)$ und $I(t_2)$ übereinstimmen und wenn die Funktionswerte
für jedes Element der Indexmenge ebenfalls übereinstimmen:
<div class="formula">$t_1 = t_2 \Leftrightarrow I(t_1) = I(t_2) \wedge \forall i \in I(t_1): t_1(i) = t_2(i)$</div>
 
'''Beweis für Attributnotation''': siehe [[Schmidt (1966)]], S. 123, Aussagen 14.10 und 14.11
 
'''Beweis für Vektornotation''': mittels vollständiger Induktion. {{TBD}}
 
=Quellen=


<references/>
<references />


=Siehe auch=
==Siehe auch==
* {{SieheAuch|Kowarschick, W. (MMDB-Skript): Skriptum zur Vorlesung Multimedia-Datenbanksysteme}}
# {{SieheAuch|Kowarschick, W. (MMDB-Skript): Skriptum zur Vorlesung Multimedia-Datenbanksysteme}}


[[Kategorie:Mengenlehre]]
[[Kategorie:Mengenlehre]]
[[Kategorie:Datenmanagement]]
[[Kategorie:Datenmanagement]]
[[Kategorie:Glossar]]
[[Kategorie:Glossar]]
[[en:Tuple]]
[[en:tupel]]

Aktuelle Version vom 22. September 2020, 15:02 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 3
(zu größeren Teilen überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Das Tupel ist eines der drei wichtigsten Containerarten der Mathematik und Informatik:

Containerart Ordnung der Elemente Duplikate erlaubt
Menge ungeordnet nein
Multimenge ungeordnet ja
Tupel i. Allg. geordnet ja

Es gibt verschiedene Arten von Tupeln und verschiedene Repräsentationsformen. Entsprechend gibt es auch diverse Definitionen und Namen: Liste, Familie, Folge, Komplex, Array, Hasharray, tuple, record, sequence, indexed family, property list, association list, row, array, map, hash map etc.

Ein Tupel ist ein Container (z. B. eine Menge, eine Klasse oder auch eine Kette von geordneten Paaren), der eine beliebige Anzahl von Schlüssel/Wert-Paaren enthält. Dabei darf kein Schlüssel doppelt vorkommen. Die Klasse aller Schlüssel heißt Indexbereich.

Die wichtigsten Tupelarten sind:

Name Definition Beispiel Indexbereich
Liste Kette von Paaren $ (2, (3, (5, (7, \emptyset)))) $
Abkürzung; $ (2, 3, 5, 7) $
$ \{1, 2, 3, 4\} $ oder
$ \{0, 1, 2, 3\} $
Familie Menge von Paaren $ \{(a, 2), (b, 3), (c, 5), (d, 7)\} $ $ \{a, b, c, d\} $
Assoziationsliste Liste/Tupel von Paaren $ ((a, 2), (b, 3), (c, 5), (d, 7)) $ $ \{a, b, c, d\} $ und
$ \{1, 2, 3, 4\} $

Die Listendefinition hat den Nachteil, dass der Indexbereich stets endlich ist. Üblicherweise handelt es sich dabei um ein Intervall von natürlichen Zahlen: $ [0, n-1] $ oder $ [1, n] $. Der Indexbereich einer Familie kann dagegen beliebig viele Elemente enthalten. Es kann sich dabei auch um exklusive Container (echte Klassen, Unmengen) handeln, die so viele Elemente enthalten, dass deren Mächtigkeit gar nicht definiert ist.

Die Familiendefinition hat dagegen den Nachteil, dass die Schlüssel/Wert-Paare Elemente eines Containers (z. B. einer Klasse) sind. Ein Container kann aber nur Individuen (einschließlich Individuen-Container wie Mengen) als Elemente enthalten, aber keine exklusiven Container. Das heißt, in einer Theorie, in der es exklusive Container gibt (wie z. B. in einer Klassentheorie), gibt es Objekte, die nicht in Familien gespeichert werden können.

Auf der anderen Seite bestehen Listen i. Allg. nur aus Paaren. Und Paare können so raffiniert definiert werden, dass nicht nur Individuen, sondern auch exklusive Container darin enthalten sein können.[1][2] Das heißt, Listen können ebenfalls exklusive Container enthalten.

Name Vorteil Nachteil
Liste
Assoziationsliste
Alle Individuen und Container
als Tupel-Elemente möglich
Individuenbereich endlich
Familie Individuenbereich beliebig Exklusiver Container nicht
als Tupel-Elemente möglich

Aus Sicht des (praktischen nicht des theoretischen) Informatikers ist diese Tabelle weniger interessant, da er sowieso nur mit endlichen Mengen arbeitet: Der Speicher ist im Gegensatz zum Speicher der Turingmaschine begrenzt. Für ihn ist vielmehr interessant, dass im endlichen Fall jede Tupelart durch jede andere ersetzt werden kann, da die verschiedenen Darstellungen (mehr oder minder gut) bijektiv aufeinander abgebildet werden können. Ihm ist wichtig, die Komplexität der CRUD-Operationen (für ein Tupel: Daten einfügen, lesen, ändern und löschen) für die einzelnen Darstellungen zu kennen, um für den jeweiligen Anwendungsfall die beste Darstellungsart wählen zu können.

Anschauliche Definition (Kowarschick)

Ein Tupel ordnet jedem Element einer Klasse (oder Menge) von Schlüsseln oder Attributnamen jeweils einen Wert zu. Ein Tupel ist also eine Klasse von unterschiedlich benannten Attributen, d. h. eine Klasse von Schlüssel/Wert-Paaren, wobei jeder Schlüssel nur einmal vorkommen darf. Unterschiedlichen Schlüsseln kann jedoch durchaus derselbe Wert zugeordnet werden. Das heißt, ein Wert kann durchaus mehrfach vorkommen. Wert-Duplikate sind also erlaubt.

Die Klasse aller Schlüssel heißt Indexbereich oder auch – sofern es sich um eine Menge handelt – Indexmenge. Wenn auf dem Indexbereich eine totale Ordnung definiert ist, sind die Schlüssel/Wert-Paare des Tupels ebenfalls (bezüglich dieser Ordnungsrelation) geordnet. Unabhängig davon, ob eine Ordnung existiert oder nicht, sind die Elemente auf jeden Fall bezüglich des Indexbereichs indexiert.

Begriff Alternativnamen englische Bezeichnungen
Tupel Liste, Familie, Folge, Komplex
Array, Assoziationsliste,
Hasharray etc.
tuple, record, sequence, indexed family,
property list, association list, row, array,
map, hash map
Indexbereich Definitionsbereich, Indexmenge domain, key set
Wertebereich Wertemenge value set
Attribut Schlüssel/Wert-Paar attribute, property, key/value pair
Attributname Schlüssel, Index key, index, attribute/property name,
attribute/property key
Attributwert Wert, Glied value, attribute/property value

Attribute können auch mehr als einen Attributnamen haben. Diese werden dann mit Schlüssel-Schlüssel-Wert-Tripeln etc. dargestellt.

Indexbereich und Indexmenge

Die Klasse aller Schlüssel eines Tupels wird Indexbereich des Tupels genannt. Wenn es sich beim Indexbereich um eine Menge handelt, kann man auch Indexmenge sagen.

Tupellänge

Die Länge eines Tupel ist gleich der Mächtigkeit des zugehörigen Indexbereichs.

Ein Tupel der Länge $ l $ wird auch $ l $-Tupel genannt.

Gleichheit zweier Tupel

Zwei Tupel sind genau dann gleich, wenn die zugehörigen Indexbereiche gleich sind und wenn die Werte jeweils gleich benannter Elemente ebenfalls gleich sind.

Formale Definition (Kowarschick)

Siehe Tupel: Formale Definition.

Anmerkungen

Tupel sind im Prinzip nichts anderes als Funktionen, deren Definitionsbereich Indexbereich genannt wird. Eine Funktion ordnet jedem Element des Definitionsbereichs einen Wert zu, entsprechend ordnet ein Tupel jedem Schlüssel, also jedem Element des Indexbereichs einen Wert zu.

Tupel können auch als geordnete Multimengen, d. h. als Listen aufgefasst werden, sofern für den Indexbereich eine Ordnung definiert ist:

  • Werte können mehrfach vorkommen (im Gegensatz zu normalen Mengen, aber in Einklang mit Multimengen).
  • Die Werte sind (gemäß der auf den Schlüsseln definierten Ordnung) angeordnet (im Gegensatz zu Mengen und Multimengen).

Üblicherweise spielt in der Informatik die Ordnung der Tupelelemente nur dann eine Rolle , wenn als Indexbereich eine Menge von aufeinanderfolgenden natürlichen Zahlen verwendet wird.

Beispiele

Tupelart Tupelschema Beispiel
Liste/Positionstupel
Attributnotation
Listennotation
math. Notation
 
{1: String, 2: {'f','m','d'}}
(String, {'f','m','d'})
 
{1: 'Anton', 2: 'm'}
('Anton', 'm')
$ (\text{Anton}, \text{m}) $
Familie/Attributtupel
Attributnotation
math. Notation
 
{name: String, sex: {'f','m','d'}}
 
{name: 'Anton', sex: 'm'}
$ \{(name,\text{Anton}), (sex,\text{m})\} $
Assoziationsliste/
Positionsattributtupel
Attributnotation


Listennotation
math. Notation
 
 
{1/name: String,
 2/sex:  {'f','m','d'}
}
(name: String, sex: {'f','m','d'})
 
 
{1/name: 'Anton',
 2/sex:  'm'
}
(name: 'Anton', sex:'m')
$ ((name,\text{Anton}), (sex,\text{m})) $

Positionsattributtupel sind Tupel, deren Attribute zwei unterschiedliche Attributnamen haben: Eine Zeichenkette und einen Positionsbezeichner. Dies ist die ideale Darstellung für Tupel, die durch Tabellenzeilen repräsentiert werden:

name sex spouse
'Anton' 'm' 'Berta'
'Berta' 'f' 'Anton'
'Cäsar' 'm' null

Jedes Attribut dieser drei Tupel hat sowohl einen Namen, der über der jeweiligen Spalte notiert wird, sowie eine Position, die sich durch die Spaltenposition ergibt.

In den folgenden Beispielen werden Attribute teils mittels Attributnotation a:v, i/a:v und teils mittels Listennotation $ (a,v) $, $ (i,a,v) $ dargestellt.

Attributnotation

Im Fall von endlichen Indexbereichen kann ein Tupel einfach durch die explizite Angabe von Schlüssel/Wert-Paaren erfolgen.

t1 = {name: 'Anton', geburtsjahr: 1961, ehefrau: 'Berta'}
t2 = {ehefrau: 'Berta', geburtsjahr: 1961, name: 'Anton'}
t3 = {name: 'Anton', geburtsjahr: 1961, hochschule: 'HSA'}
t4 = {name: 'Anton', geburtsjahr: 1962, hochschule: 'HSA'}
t5 = {name: 'Anton', geburtsjahr: 1961, ehefrau: 'Berta', hochschule: 'HSA'}

Nur Tupel t1 und t2 sind gleich, alle anderen Tupel unterscheiden sich. Entweder unterscheiden sich die Indexbereiche (t1 bis t4 haben die Länge 3, Tupel t5 hat dagegen die Länge 4) oder es stimmen nicht alle gleich benannten Elemente überein (alle übrigen Tupelpaare).

Folgendes ist kein Tupel (und damit auch keine Funktion), da zwei Elemente gleich benannt sind:

{name: 'Anton', name: 'Cäsar', hochschule: 'HSA'}

Attributnotation in der Informatik

Die Attributnotation kommt in der Informatik häufig zum Einsatz. Beispielsweise können in JSON innerhalb einer Mengenklammer beliebig viele (jedoch nur endlich viele) Attribute angeben werden. Als Attributnamen werden Zeichenketten (Strings) verwendet, die mit Anführungszeichen " markiert sind. Der zugehörige Attributwert wird vom Attributnamen durch einen Doppelpunkt abgetrennt.

{"name": "Anton", "geburtsjahr": 1961, "ehefrau": "Berta"}
...

Weitere Beispiele für Datenstrukturen, in denen Mengen von Schlüssel/Wert-Paaren zum Einsatz kommen:

  • C/C++: Datentyp struct (die Länge kann zur Laufzeit nicht verändert werden)
  • Pascal: Datentyp record (die Länge kann zur Laufzeit nicht verändert werden)
  • diverse Sprachen: Hashtabelle (auch hash map, hash array, assoziatives Array etc.; die Länge kann zur Laufzeit verändert werden)
  • SQL: Tabellenzeilen, d. h. Elemente von Relationen (die Länge kann zur Laufzeit durch Schema-Evolution verändert werden)
  • JavaScript: Objekte (die Länge kann zur Laufzeit verändert werden, sofern dies nicht explizit mittels Object.freeze „untersagt“ wird)
  • Java und viele andere Sprachen: Objekte (die Länge kann zur Laufzeit i. Allg. nicht verändert werden)

Attributzugriff

Um mittels des Attributnamens auf einen Attributwert zuzugreifen, haben sich in der Informatik zwei syntaktische Konstrukte etabliert (obwohl es durchaus noch Sprachen gibt, die andere syntaktische Konstrukte verwenden):

  • Die Indexnotation: t1["name"], t5["ehefrau"] etc.
  • Die Punktnotation: t1.name, t5.ehefrau etc.

In der Mathematik sind dagegen folgende Konstrukte üblich:

  • Die Funktionsauswertung: $ \rm{t1}(\rm{name}) $, $ \rm{t5}(\rm{ehefrau}) $ etc.
  • Die Projektionsfunktion $ π $: $ π_{\rm{name}}(\rm{t1}) $, $ π_{\rm{ehefrau}}(\rm{t5}) $ etc.
  • Die Indexnotation: $ \rm{t1}_{\rm{name}} $, $ \rm{t5}_{\rm{ehefrau}} $ etc.

Listennotation

Für Tupel, deren Indexbereich eine Menge von $ n $ aufeinanderfolgenden natürlichen Zahlen ist (i. Allg. $ \{i| 0 < i \le n\} $, oder, wie in vielen Programmiersprachen üblich, $ \{i| 0 \le i < n\} $), bietet sich die in der Mathematik gebräuchliche Listennotation an. Bei dieser werden die Schlüssel nicht explizit angegeben, sondern implizit durch die Position der Elemente festgelegt:

$ t_6 := (555, 333) $
$ t_7 := (333, 555) $
$ t_8 := (555, 333, 555) $
$ t_9 := (0, 1, 1, 2, 3, 5, 8, \ldots) $ (Fibonacci-Zahlen)

Die Tupel $ t_6 $ bis $ t_9 $ unterscheiden sich alle voneinander. In Tupel $ t_6 $ steht an Position 1 das Element $ 555 $, während in Tupel $ t_7 $ an Position 1 das Element $ 333 $ steht. Tupel $ t_8 $ unterscheidet sich von Tupel $ t_6 $ und $ t_7 $, da die Indexbereiche ($ \{1,2\} $ bei Tupel $ t_6 $ und $ t_7 $; $ \{1,2,3\} $ bei Tupel $ t_8 $) nicht übereinstimmen.

Tupel $ t_6 $ und $ t_7 $ sind 2-Tupel, Tupel $ t_8 $ ist um ein Element länger, die Länge von Tupel $ t_9 $ beträgt ω. Tupel $ t_9 $ enthält also abzählbar unendlich viele Elemente. Da ein unendlich großes Tupel nicht mehr explizit angegeben werden kann, muss die Definition entweder anschaulich erfolgen (siehe obige Definition von Tupel $ t_9 $) oder mittels einer Rechenvorschrift:

$ \rm{fib(n)} := \begin{cases} 0 & n = 0\\ 1 & n = 1\\ \rm{fib}(n-1) + \rm{fib}(n-2) & \text{otherwise} \end{cases}\\ t_9 := (\rm{fib}(0), \rm{fib}(1), \rm{fib}(2), \rm{fib}(3), \ldots)\\ t_9(i) := \rm{fib}(i) $

Listennotation in der Informatik

In der Informatik, wie beispielsweise in JSON, kommt die Listennotation ebenfalls zu Einsatz:

t6 = [555, 333]
t7 = [333, 555]
t8 = [555, 333, 555]

Unendliche lange Tupel können in JSON nicht definiert werden. Allerdings ist es in JavaScript möglich, mittels Generatoren beliebig große Tupel zu generieren. Der Generator selbst kann als unendlich langes Tupel aufgefasst werden:

// Generator für Fibonacci-Zahlen (BigInt).
function* fib() 
{ let a = 0n, b = 1n; // 0n = BigInt(0), 1n = BigInt(1), ...
  yield a;
  yield b;
  while (true) 
  { [a, b] = [b, a+b];
    yield b;
  }
}

// Hilfsfunktion zum Materialisieren der
// ersten n Elemente eines Generators. 
function take(n, p_iterable) 
{ let tuple = [], i = 0;
  while (i++ < n) 
  { tuple.push(p_iterable.next().value);  }
  return tuple;
}

let f = fib();
console.log(f.next().value, f.next().value, f.next().value, f.next().value, f.next().value);
// -> 0n, 1n, 1n, 2n, 3n
console.log(take(1000, fib()));
// -> [0n, 1n, 1n, 2n, 3n, 5n, 8n, 13n, 21n ...] // tausend Elemente

In der Informatik finden sich weitere Datenstrukturen, in denen Elemente sequenziell abgespeichert werden, d. h., bei denen Tupel nicht als Menge von Attributen, sondern als Folge von Elementen aufgefasst werden:

  • Arrays oder Felder (häufig mit fixer Länge)
  • Listen in zahlreichen Ausprägungen (i. Allg. mit variabler Länge)
  • Streams (evtl. sogar unendlich lang)

Attributzugriff

Um mittels der Attributposition auf einen Attributwert zuzugreifen, hat sich in der Informatik ein syntaktisches Konstrukt etabliert:

  • Die Indexnotation: t[1], t[2] etc.

Bei verketteten Listen, Streams etc. ist der Zugriff auf ein Element an einer bestimmten Position dagegen manchmal nur dadurch möglich, dass man sich mittels einer Funktion oder Methode (z. B. next) von einem Element zu nächsten „hangelt“ (Traversierung), bis man beim gewünschten Element angekommen ist (siehe z. B. die Funktion take im vorangegangenen Abschnitt).

In der Mathematik sind dagegen folgende Konstrukte üblich:

  • Die Funktionsauswertung: $ t(1) $, $ t(2) $ etc.
  • Die Indexnotation: $ t_1 $, $ t_2 $ etc.
  • Die Projektionsfunktion $ π $: $ π_1(t) $, $ π_2(t) $ etc.

Spezielle Tupel mit Positionsattributen

Länge $ n $ Name Attributnotation Listennotation
0 Leeres Tupel $ \{\} $ $ () $
1 Single $ \{(1,5)\} $ $ (5) $
2 (geordnetes) Paar $ \{(1,5),\,(2,3)\} $ $ (5,\,3) $
3 Triple $ \{(1,5), (2,3), (3,8)\} $ $ (5,\,3,\,8) $
4 Quadrupel $ \{(1,5),\,(2,3),\,(3,8),\,(4,π)\} $ $ (5,\,3,\,8,\,π) $
5 Quintupel $ \vdots $ $ \vdots $
6 Sextupel
7 Septupel
8 Oktupel
$ \vdots $ $ \vdots $
100 Centupel
n n-Tupel
ω oder $ \aleph_0 $ ω- oder oder $ \aleph_0 $-Tupel $ \{(i,i^2)| i \in \mathbb N\} $ $ (i^2)_{i \in \mathbb N} $
$ 2^{\aleph_0} $ $ 2^{\aleph_0} $-Tupel $ \{(r,r^2)| i \in \mathbb R\} $ $ (r^2)_{r \in \mathbb R} $

Jede endliche oder abzählbar unendliche Folge, Sequenz oder Familie kann als Tupel in Listennotation aufgefasst werden. Jede (mathematische) Funktion kann als Tupel aufgefasst werden.

Geschichte

Definition „Tupel“ (Bourbaki (1939)[3])

Die Mathematiker der Gruppe Bourbaki definieren zunächst das geordnete Paar (couple) nach Kazimierez Kuratowski und erwähnen, dass es das Paaraxiom erfüllt (S. E II.7):

On dit que le terme $ \{\{x\},\{x,y\}\} $ est le couple formé de $ x $ et de $ y $, et on le note de façon abrégée $ (x, y) $, de sorte que la relation $ (x, y) = (x', y') $ est equivalente a «$ x = x' $ et $ y = y' $».

Im Anschluss daran definieren sie das geordnete Tripel (triplet) mit Hilfe zweier Paare (S. E II.9):

... un élément $ ((x, y), z) $ de $ A \times B \times C $ s'écrit aussi $ (x, y, z) $ et s'appelle un triplet.

Sie weisen außerdem daraufhin, dass sich dies für vier und mehr Elemente verallgemeinern lässt.

Auf Seite E IV.5 führt Bourbaki den Begriff Tupel (multiplet) für den Term $ (s_1,\ldots,s_p) $ ein und verweisen dabei explizit auf die obige Definition.

Zusammenfassung: Der Begriff Tupel (multiplet) wird von Bourbaki folgendermaßen definiert:

$ (x,y) := \{\{x\},\{x,y\}\} $
Wenn $ n \ge 3 $, dann $ (x_1,\ldots,x_n) := ((x_1,\ldots,x_{n-1}), x_n) $

Definition „Familie“ (Bourbaki (1939)[4])

Die Mathematikergruppe Bourbaki definiert zunächst funktionelle Relationen (Relations fonctionelles) als Relationen $ R $, die rechtseindeutig sind (S. E I.40):

$ (\forall y)(\forall z)(((y|x)R \,\text{et}\, (z|x)R) \Rightarrow (y = z)) $

Im Anschluss an die Paardefinition (siehe vorangegangenen Abschnitt) zeigt das Mathematikerteam, dass jede Relation eindeutig durch eine Menge von Paaren repräsentiert wird. Diese Menge bezeichnen sie als Graph (graphe) der Relation:

$ (\exists G)(G \,\text{est un graphe et}\, (\forall x)(\forall y)(R \Leftrightarrow ((x, y) \in G))) $ Le graphe $ G $ est alors unique en vertu de l'axiome d'extensionalite, et s'appelle le graphe de $ R $

Anschließend definieren sie die eigentlichen Funktionen (fonctions) als funktionelle Relationen mit Definitionsbereich $ A $ und Wertebereiche $ B $ (S. E II.13):

Autrement dit, une correspondance $ f = (F, A, B) $ est une fonction si, pour taut $ x $ appartenant à l' ensenzble de départ $ A $ de $ f $, la relation $ (x,y) \in F $ est fonctionnelle en $ y $ (I, p. 41);

$ F $ ist als Graph der Funktion eine Menge von Paaren. Dies ist die typische mengentheoretische Definition des Funktionsbegriffs.

Zu guter Letzt führt die Gruppe den Begriff Familie als Alternative für den Begriff Funktion ein (S. E II. 16):

Si $ f $ est une application de $ A $ dans $ B $, la fonction $ f $ est égale à la fonction $ x \rightarrow f(x) (x \in A, f(x) \in B) $, qu'on écrit sirnplement $ x \rightarrow f(x) $, ou aussi $ (f_x)_{x \in A} $ c'est surtout quand on utilise la dernière notation qu'on parle de « famille d'éléments » au lieu de « fonction ».

Die Begriffe Familie und Funktion unterscheiden sich nur syntaktisch. Die Syntax $ (f_x)_{x \in A} $ wurde in Anlehnung an die Tupelsyntax gewählt und betont damit die Verwandtschaft zwischen diesen beiden Begriffen. Der Begriff Familie kann also als Alternative für den Begriff Tupel aufgefasst werden. Diese Definition hat den Vorteil, dass auch leere, einelementige und nicht-endliche Indexbereiche unterstützt werden.

Definition „Tupel“ (Gödel (1940)[5])

Dfn $ <x\,y> = \{\{x\}\{x\,y\}\} $
Dfn $ <x_1\,\ldots\,x_n> = <x_1\,<x_2\,\ldots\,x_{n}>> $ [Anm. WK: wobei $ n \ge 3 $]
Dfn $ <x> = x $

Wegen der Rechtsassoziativität gilt folgender Satz (wie man laut Gödel per Induktion nachweist):

$ <x_1\,\ldots\,x_n\,<x_{n+1}\ldots x_{n+p}>> = <x_1\,\ldots\,x_{n}\,x_{n+1}\,\ldots\,x_{n+p}> $

Anmerkung:
Diese Definition unterschiedet sich nicht wesentlich von der oben angeführten Tupel-Definition der Mathematikergruppe Bourbaki: Die Klammerung ist rechts- an Stelle von linksassoziativ und das einelementige Tupel wurde als Spezialfall ergänzt.

Definition „List“ (McCarthy (1960)[6])

S-expressions are then defined as follows:

  1. Atomic symbols are S-expressions.
  2. If $ e_1 $ and $ e_2 $ are S-expressions, so is $ (e_1 \cdot e_2) $.

...

An S-expression is then simply an ordered pair, the terms of which may be atomic symbols or simpler S-expressions. We can represent a list of arbitrary length in terms of S-expressions as follows. The list

$ (m_1, m_2, \cdots, m_n) $

is represented by the S-expression

$ (m_1 \cdot (m_2 \cdot (\cdots (m_n \cdot \text{NIL}) \cdots ))) $

Here $ \text{NIL} $ is an atomic symbol used to terminate lists.

Anmerkung:
McCarthy erwähnt, dass es auch einelementige Listen gibt: $ (m) = (m \cdot \text{NIL}) $. Im Gegensatz zur Definition von Gödel unterscheiden sich einelementige Tupel von ihren Elementen; $ e \ne (e) $. Bei Gödel gilt dagegen $ e = <e> $. Mehr noch, es gibt nun auch Tupel der Länge 0. Dies wurde McCarthy allerdings erst später klar. In seiner Definition von LISP 1.5 definiert er das leere Tupel explizit: $ () := NIL $ (siehe nächsten Abschnitt).

Definition „List“ (McCarthy et al. (1965)[7])

Seite 2:

An S-expression is either an atomic symbol or it is composed of these elements in the following order: a left parenthesis, an S-expression, a dot, an S-expression, and a right parenthesis.

Notice that this definition is recursive.

Seite 4:

Any S-expression can be expressed in terms of the dot notation. However, LISP has an alternative form of S-expression called the list notation. The list (m₁ m₂ . . . mₙ) can be defined in terms of dot notation. It is identical to (m₁ . (m₂ . ( . . . . (mₙ . NIL). . . ))).

The atomic symbol NIL serves as a terminator for lists. The null list ( ) is identical to NIL.

Definition „Property List“ (McCarthy et al. (1965)[8])

Seite 39:

In LISP 1.5 wird eine (interne) Datenstruktur property list definiert, die dazu verwendet wird, atomaren Symbolen eine ganze Liste von Eigenschaften (properties) zuzuordnen. Dabei wird jede Eigenschaft (property) von einem atomaren Symbol eingeleitet, welches Indikator (indicator) genannt wird.

Seite 58:

In LISP 1.5 gibt es eine Pseudofunktion „define“, um atomaren Symbolen Properties zuzuordnen:

The argument of define, x, is a list of pairs

((u₁ v₁) (u₂ v₂) ... (uₙ vₙ))

where each u is a name and each v is a λ-expression for a function. For each pair, define puts an EXPR on the property list for u pointing to v. The function of define puts things on at the front of the property list.

McCarthy hat in LISP 1.5 also neben den normalen Listen auch Assoziationslisten eingeführt (und diese property lists genannt).

Common Lisp

In Common List gibt es neben den von McCarthy eingeführten Listen zusätzlich sogar zwei Arten von Assoziationslisten: “association lists” und “property lists”.

Definition “Association List” (Steele (1990), S431[9])

An association list, or a-list, is a data structure used very frequently in Lisp. An a-list is a list of pairs (conses); each pair is an association. The car of a pair is called the key, and the cdr is called the datum.

Übersetzung (W. Kowarschick):
Eine Assoziationsliste oder A-Liste ist eine Datenstruktur, die in Lisp sehr oft benutzt wird. Eine A-Liste ist eine Liste von Paaren (Cons-Zellen); jedes Paar ist eine Assoziation. Das car-Element [WK: das erste Element] eines Paares wird Schlüssel genannt und das cdr-Element [WK: das zweite Element] wird Datum genannt.

Definition “Property List” (Steele (1990), S. 238 – 239[10])

Since its inception, Lisp has associated with each symbol a kind of tabular data structure called a property list (plist for short). A property list contains zero or more entries; each entry associates with a key (called the indicator), which is typically a symbol, an arbitrary Lisp object (called the value or, sometimes, the property). There are no duplications among the indicators; a property list may only have one property at a time with a given name. In this way, given a symbol and an indicator (another symbol), an associated value can be retrieved.

A property list is very similar in purpose to an association list. The difference is that a property list is an object with a unique identity; the operations for adding and removing property-list entries are destructive operations that alter the property list rather than making a new one. Association lists, on the other hand, are normally augmented non-destructively (without side effects) by adding new entries to the front (see acons and pairlis).

Übersetzung (W. Kowarschick):
Von Anfang an wurde in Lisp jedes Symbol mit einer Art tabellenartiger Datenstruktur verknüpft, die Propertyliste [WK: Eigenschaftsliste] genannt wird (kurz P-Liste). Eine Propertyliste enthält null oder mehr Einträge: Jeder Eintrag verknüpft einen Schlüssel (Indikator genannt), welcher typischerweise ein Symbol ist, mit einem beliebigen Lisp-Objekt (Wert genannt oder manchmal auch Property [WK: Eigenschaft]). Unter den Indikatoren gibt es keine Duplikate; eine Propertyliste kann zu jedem Zeitpunkt nur eine Eigenschaft mit einem gegebenen Namen haben. Auf diese Art kann für ein gegebenes Symbol und einen gegebenen Indikator (ein anderes Symbol) auf einen [WK: mit dem Symbol] verknüpften Wert zugegriffen werden.

Der Zweck einer Propertyliste ist dem einer Assoziationsliste sehr ähnlich. Der Unterschied ist, dass eine Propertyliste ein Objekt mit einer eindeutigen Identität ist; die Operationen zum Hinzufügen und Löschen von Propertylisten-Einträgen sind destruktive Operationen, die die Propertyliste verändern anstatt eine neue zu erstellen. Assoziationslisten werden demgegenüber nicht-destruktiv erweitert (ohne Seiteneffekte), indem neue Einträge vorne hinzugefügt werden (vgl. acons und pairlis).

Definition „Tupel“ (Schmidt (1966)[1])

Schmidt definiert Tripel, Quadrupel ..., $ n $-Tupel genauso wie Bourbaki (siehe oben). Allerdings verwendet er eine eigene Definition des geordneten Paares, die auch echte Klassen zulässt:

$ (x,y) := \{\,\{\{x\}\}: x \in a\,\} \,\cup\, \{\,\{\emptyset, \{x\}\}: x \in b\,\} $
Wenn $ n \ge 3 $, dann $ (x_1,\ldots,x_n) := ((x_1,\ldots,x_{n-1}), x_n) $

Anmerkung:
Damit ist es z. B. möglich, das Monoid $ (\Omega, +, *) $ der Ordinalzahlen $ \Omega $, auf denen eine Addition und eine Multiplikation definiert ist[11], als Tupel zu definieren. Die Klasse der Ordinalzahlen $ \Omega $ ist eine Unmenge, wie schon Burali-Forti und Cantor gezeigt haben[12][13].

Definition „Familie“ (Schmidt (1966)[14])

Schmidt definiert Funktionen $ f $ als Relation (d. h. als Teilklasse von $ \mathcal{V} \times \mathcal{V} $), die folgende Eindeutigkeitsbedingung erfüllt (S. 119):

$ \bigwedge x \bigwedge y \bigwedge z ((x,y) \in f \wedge (x,z) \in f \Rightarrow y=z) $

Den Wert der Funktion $ f $ an der Stelle $ x $ berechnet er folgendermaßen:

$ f(x) := \bigcap\{y|(x,y) \in f\} $

Das heißt, eine Funktion ist eine Klasse von geordneten Paaren (wobei die Paare selbst nur Mengen als Elemente enthalten können), bei denen kein Element des Definitionsbereichs doppelt vorkommt.

Er führt dann (S. 122) den Begriff Familie oder Folge als Synonym für den Begriff Funktion ein. Den Definitionsbereich nennt er in diesem Fall Indexbereich. Ein Element eines Indexbereichs heißt Index. An Stelle der Schreibweise $ f(x) $ verwendet er die Indexschreibweise $ f_x $.

Anmerkungen:
Im Prinzip unterscheidet sich diese Definition nicht wesentlich von der Definition von Bourbaki. Schmidt unterscheidet allerdings nicht zwischen Funktion und Funktionsgraph. Außerdem ist sein Funktionsbegriff in der Hinsicht allgemeiner, dass eine Funktion nicht notwendigerweise eine Menge von Paaren ist, sondern auch eine echte Klasse von Paaren sein kann.

Auf der einen Seite ist der Begriff Schmidt-Familie universeller als der Begriff Schmidt-Tupel, da der Indexbereich auch leer, einelementig und beliebig groß sein kann. Auf der anderen Seite ist der Begriff Schmidt-Tupel universeller als der Begriff Schmidt-Familie, da ein Tupel auch echte Klassen als Elemente enthalten kann.

Definition „Tupel“ (Ebbinghaus (2003)[15])

Ebbinghaus definiert zunächst das geordnete Paar

$ (x,y) := \{\{x\},\{x,y\}\} $

nach Kazimierez Kuratowski und verallgemeinert es dann für beliebige $ n $-Tupel ($ n \ge 1 $):

(i) $ (x) := x $
(ii) Für $ n \ge 1 $ sei $ (x_0,\ldots,x_n) := ((x_0,\ldots,x_{n-1}), x_n) $

Er formuliert den folgenden Satz:

$ (x_0,\ldots,x_n) = (y_0,\ldots,y_n) \leftrightarrow x_0 = y_0 \wedge \ldots \wedge x_n = y_n $

Einen Beweis gibt er nicht an, da sich dieser leicht durch metaprachliche Induktion ergäbe.

Anmerkung:
Diese Definition unterscheidet sich nicht von der Definition der Mathematikergruppe Bourbaki (siehe oben). Es wurde lediglich das einelementige Tupel als Spezialfall ergänzt, in derselben Weise, wie dies Gödel vorgeschlagen hat (siehe oben).

Definition „Familie“ (Ebbinghaus (2003)[16])

TO BE DONE

Quellen

  1. 1,0 1,1 Schmidt (1966): Jürgen Schmidt; Mengenlehre – Grundbegriffe; Reihe: B.I.Hochschultaschenbücher; Band: 1; Nummer: 56; Verlag: Bibliographisches Institut AG; Adresse: Mannheim; ISBN: B0000BUJC6; 1966; Quellengüte: 5 (Buch), S. 100
  2. Glubrecht, Oberschelp, Todt (1983): Jürgen-Michael Glubrecht, Arnold Oberschelp und Günter Todt; Klassenlogik; Verlag: Bibliographisches Institut; Adresse: Mannheim, Wien, Zürich; ISBN: 3-411-01634-5, 978-3411016341; 1983; Quellengüte: 5 (Buch)
  3. Bourbaki (1939): Nicolas Bourbaki; Théorie des ensembles; Verlag: Hermann; Adresse: Paris; 1939; Quellengüte: 5 (Buch), S. E II.7, E II.9, E IV.5
  4. Bourbaki (1939), S. E I.40, S. E II.13, S. E II.16
  5. Gödel (1940): Kurt Gödel; The Consistency of the Continuum Hypothesis; Verlag: Princeton University Press; ISBN: 0-691-07927-7; Web-Link; 1940; Quellengüte: 5 (Buch), S. 4
  6. McCarthy (1960): John McCarthy; Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I; in: Communications of the ACM; Band: 3; Nummer: 4; Seite(n): 184-195; Verlag: Association for Computing Machinery; Adresse: New York; Web-Link 0, Web-Link 1; 1960; Quellengüte: 5 (Artikel), S. 187
  7. McCarthy et. al. (1965): John McCarthy, Paul W. Abrahams, Daniel J. Edwards, Timothy P. Hart und Michael I. Levin; LISP 1.5 Programmer's Manual; Verlag: The MIT Press; Adresse: Cambridge, Massachusetts; Web-Link; 1965 (Buch), S. 2, S. 4
  8. McCarthy et. al. (1965), S. 39, S. 58
  9. Steele (1990): Guy L. Steele Jr.; Common Lisp – The Language; Verlag: Addison Wesley Longman; Adresse: Bonn; ISBN: 3-8273-1023-7; Web-Link; 1996 (Buch), S. 431, https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153.html
  10. Steele (1990), S .238 – 239, https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node108.html
  11. Cantor (1897): Georg Cantor; Beiträge zur Begründung der transfiniten Mengenlehre – (Zweiter Artikel.); in: Mathematische Annalen; Band: 49; Nummer: 2; Seite(n): 207 – 246; Verlag: B. G. Teubner Verlag; Adresse: Leipzig; Web-Link 0, Web-Link 1, Web-Link 2, Web-Link 3; 1897; Quellengüte: 5 (Artikel)
  12. Burali-Forti (1897): Cesare Burali-Forti; Una questione sui numeri transfiniti; in: Rendiconti del Circolo Matematico di Palermo; Band: 11; Seite(n): 154–164; Verlag: Springer-Verlag; ISSN: 0009-725X; Web-Link; 1897; Quellengüte: 5 (Artikel)
  13. Cantor (1899): Georg Cantor; 163 Dedekind – Halle, 3. 8. 1899 – II, XXIV; Hrsg.: Herbert Meschkowski und Winfried Nilson; Seite(n): 407 – 411; Verlag: Springer-Verlag; ISBN: 978-3540506218, 978-3642743450; 1991; Quellengüte: 5 (Sammelband)
  14. Schmidt (1966), S. 119, S. 120, S. 122
  15. Ebbinghaus (2003): Heinz-Dieter Ebbinghaus; Einführung in die Mengenlehre; Reihe: Hochschultaschenbuch; Auflage: 4; Verlag: Spektrum Akademischer Verlag; Adresse: Heidelberg, Berlin; ISBN: 3-8274-1411-3; 2003; Quellengüte: 5 (Buch), S. 59 – 60
  16. Ebbinghaus (2003), S. 55, S. 59 – 60

Siehe auch

  1. Kowarschick (MMDB-Skript): Wolfgang Kowarschick; Vorlesung Multimedia-Datenbanksysteme – Sommersemester 2018; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 4 (Skript)