Listprocessing

Aleph besitzt auch Fähigkeiten der Listenverarbeitung. Es ist aber keine Anweisung für die Unifikation vorhanden. Aleph ist kein Prolog, kein Lisp, kein Scheme. Es kann in diese Richtung erweitert werden (das gilt für jede Programmiersprache).

Für LISP, oder Prolog und ähnliche gibt es exzellente Lösungen. Aleph hat nicht den Ehrgeiz auf diesem Gebiet mitzuspielen. Trotzdem sollte es dem Anwender überlassen sein, ein Interface zu etablierten Systemen zu benutzen, oder selbst auf diesem Gebiet zu arbeiten. Die Datei "lists.vvm" stellt die nötigen Grundlagen bereit. Weil Aleph-Variablen auch mit Listen "klarkommen", ist es bestimmt interessant hier mehr zu machen.

Aufbau einer Liste

Die Anweisung zur Erstellung einer Liste lautet einfach "list". Der Aufbau erfolgt direkt aus der Eingabe. Um Listen als Text zu formulieren, müssen Regeln vorhanden sein. Diese Regeln beschreiben Anfang und Ende von Listen und die Unterscheidung der enthaltenen Elemente.

" ( " ist Listenanfang (Leerzeichen nicht vergessen).

" ) " ist Listenende

Jede andere Zeichenfolge ist ein atomares Element.

Eine sehr wichtige Eigenschaft von Listen ist ihre Fähigkeit Listen als Elemente zu enthalten. Diese Elemente sind dann nicht mehr atomar. Der Begriff atomar wird im Abschnitt "Listen zerlegen" besprochen. Listen können leer sein, sie enthalten dann einfach keine Elemente.

list ( a b c )
list ( )
list ( a ( 1 2 ) b c )

Diese Zeilen erzeugen drei Listen und legen sie auf dem Stack ab. Um eine Liste anzuzeigen ist die Anweisung "show" vorhanden.

Achtung! Für das "."-Command (dot) ist eine Liste nur ein Objekt.

Listen zerlegen

Für Listen gilt eine sehr einfache Definition ihres Aufbaus. Eine Liste ist leer oder nicht. Wenn sie nicht leer ist, besteht die aus einem Kopf (head) und einem Schwanz (tail).

Für eine komplette Zerlegung sind zwei Anweisungen erforderlich. Mit "head" wird der Kopf einer Liste ermittelt, mit "tail" der Schwanz.

list ( X Y Z ) dup dup
"Liste " . show "
hat den Kopf " .
head show
" und den Schwanz " .
tail show

In Prolog wird das Aufspalten einer Liste in Kopf und Schwanz über den Operator "|" erreicht (allerdings steckt in Prolog noch wesentlich mehr dahinter). In Aleph erfolgt die einfache Aufspaltung über "split". Die folgenden Sequenzen zeigen im Ergebnis den "|"-Operator aus Prolog als Trennzeichen zwischen Kopf und Schwanz.

list ( ( A B ) C )
dup "Liste " . show " \"gesplittet\" " .
split show "|" . show

ergibt: Liste ( ( A B ) C ) "gesplittet" ( A B )|( C )

list ( ( X Y Z ) ) dup "Liste " . show " \"gesplittet\" " .
split show "|" . show

ergibt: Liste ( ( X Y Z ) ) "gesplittet" ( X Y Z )|( )

Der Kopf kann eine Liste oder ein Atom sein. Der Schwanz ist immer eine Liste. Eine leere Liste kann nicht in zwei Teile zerlegt werden, wohl aber eine leere Liste mite einer leeren Liste

list ( ( ) ) dup "Liste " . show " \"gesplittet\" " .
split show "|" . show

ergibt: Liste ( ( ) ) "gesplittet" ( )|( )

Die Kombination von Listen und Variablen kann zu sehr leistungsfähigen Anwendungen führen. Weil Aleph-Variablen mit gleichen Namen mehrfach erzeugt werden können und sich trotzdem voneinander unterscheiden (siehe Beispiel Rekursion in Aleph), kann die Unifikation sehr einfach realisiert werden.

Zweifellos werden die folgenden Versionen von Aleph mehr zum Thema Listen bereitstellen.