|
|||
|
Main:
Index Contact Links Studies: Informatics Scripts Material Projects: Git repository Programs: cdplay ECMS lip.C baseclc.c nfa-util.C tm.C termreplace psi_pw_decode bummskraut Perl: AnyEvent::XMPP Net::XMPP2 AnyEvent::IRC Object::Event AnyEvent::HTTPD AnyEvent::EditText MIDI::Sequencer Music: Ta-Sa Music Languages: LR Grammar Collection Deliantra: Deliantra GNU Smalltalk: Links Other: Laughing man logo ta-sa.org |
Termreplace - last change:
added termreplace project.,
Wed Jan 21 11:37:25 2009 +0100
termreplace - A term substitution programYou will find here the description of my simple term replacement system. It's documentation is mostly in german. The Perl script termreplace can be found at: snippets/perl/term/termreplace. Some examples can be found here (look for *.term files): snippets/perl/term/*.term. Here is the HTML version of the POD of termreplace:
NAMEtermreplace - Ein Termersetzungssystem
VERSIONVersion 0.1
SYNOPSIS$ cat > test.term a 2 b 0 a(x,b) = x ? a(b,b) <CTRL-D> $ ./termreplace ./test.term $ cat test.term | ./termreplace
DESCRIPTIONDieses Programm liest eine Beschreibung eines Termersetzungssystem ein, bestehend aus einer Signatur, einer Liste von Termersetzungsregeln und Termen die transformiert werden sollen. Das Eingabeformat ist wie folgt (EBNF):
Zahl = ("1" | ... | "9") { ("0" | ... | "9") }
Zeichen = "a" | ... | "z" | "A" | ... | "Z" | "0" | ... "9" ;
Identifier = Zeichen { Zeichen } ;
Argumente = Identifier { "," Identifier } ;
Term = Identifier [ "(" Argumente ")" ] ;
Signatur = Identifier " " Zahl ;
Regel = Term " " "=" " " Term ;
Transformation = Term ;
Die Eingabe setzt sich dann mit Zeilenumbrüchen getrennten Wenn das eingegebene Termersetzungssystem nicht noethersch ist, dann kann es dazu kommen, dass das Programm in einer Endlosschleife gerät.
EXAMPLEHier ein Beispiel um die Ausgabe zu erklären: f 1 b 0 c 0 f(b) = c f(x) = b ? f(f(x)) Wir haben also eine Funktion (
$ ./termreplace example.term
Signature:
c(0)
b(0)
f(1)
Rules:
f(b) == c
f(x) == b
Terms:
f(f(c))
############################################ # f(f(c)) ############################################
f(f(c))
* f(x) => b
-> f(b)
-> b
f(b)
* f(b) => c
-> c
* f(x) => b
-> b
b c b ============================================ Transformations: > c > b Hier nun eine Detailierte Erklärung der Ausgabe: Am Anfang sieht man die Eingabe noch einmal Wiederholt, zum kontrollieren:
Signature:
c(0)
b(0)
f(1)
Rules:
f(b) == c
f(x) == b
Terms:
f(f(c))
Danach wird für jeden Term der transformiert werden soll Ein Kopf ausgegeben: ############################################ # f(f(c)) ############################################ Gefolgt von der Transformation, bei der ein Schritt ca. so aussieht:
f(b)
* f(b) => c
-> c
* f(x) => b
-> b
Der Term der am Zeilenanfang steht ist der Term der als naechstes
transformiert wird. Danach werden die angewendeten Regeln aufgelistet
und das was sie Erzeugen. Dabei ist eine Regelanwendung mit einem Nach allen Schritten wird dann das Endresultat ausgegeben, welches aus allen irreduziblen Resultaten besteht:
============================================
Transformations:
> c
> b
Im Beispiel war das Termersetzungssystem offenbar nicht konfluent bzw. kanonisch,
da man aus
COPYRIGHT & LICENSECopyright 2009 Robin Redeker, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. |
||
| All logos and trademarks on this site are property of their respective owner. Site admin is: elmex@ta-sa.org | |||