Automatisierte Logik und Programmierung
Automatisierte Logik und Programmierung
Automatisierte Logik und Programmierung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
1994/95<br />
Christoph Kreitz<br />
FG Intellektik, TH Darmstadt, Telephon 16-2863<br />
kreitz@intellektik.informatik.th-darmstadt.de
Probleme der Kommerziellen Softwareproduktion<br />
KONVENTIONELLE SOFTWAREPRODUKTION<br />
Anforderung<br />
KUNDE<br />
Spezifikation<br />
exakte<br />
Beschreibung<br />
Programm<br />
COMPUTER<br />
Sumpf der Unklarheit<br />
Wildnis der Lösungs− wege<br />
• “von Hand”, direkt in Programmiersprache, schnell<br />
• Software-Krise<br />
– Hohe Kosten für Erstellung <strong>und</strong> Wartung<br />
– Modifikationen <strong>und</strong> Erweiterungen schwierig<br />
– Mangelnde Zuverlässigkeit mit fatalen Folgen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 1 Einführung
Maximale Segmentsumme<br />
• Gegeben eine Folge a 1 , a 2 , . . . , a n ganzer Zahlen<br />
Bestimme die Summe Σ q i=p a i eines Segmentes, die maximal<br />
im Bezug auf alle möglichen Summen von Segmenten ist<br />
M n ≡ max({Σ q i=p a i | 1≤p≤q≤n})<br />
• Direkte Lösung leicht zu finden, aber ineffizient<br />
• Induktive Betrachtung liefert<br />
M 1 = a 1<br />
, M n+1 = max(M n ,L n+1 )<br />
wobei L n ≡ max({Σ n i=p a i | 1≤p≤n})<br />
L 1 = a 1 , L n+1 = max(L n +a n+1 ,a n+1 ) )<br />
→ eleganterer <strong>und</strong> effizienterer Algorithmus<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 2 Einführung
Maximale Segmentsumme – direkte Lösung<br />
maxseg:INTEGER is<br />
local p, q, i, sum :INTEGER<br />
do<br />
from p := lower<br />
-- variiere untere Grenze p<br />
Result := item(lower); -- Initialwert zum Vergleich<br />
until p >= upper<br />
loop<br />
from q := p<br />
-- variiere obere Grenze q<br />
until q > upper<br />
loop<br />
from i := p ; -- Berechne ∑ q<br />
i=p a i<br />
sum := item(i) -- Initialwert der Summe<br />
until i = q<br />
loop<br />
i := i+1; sum := sum+item(i)<br />
end -- sum = ∑ q<br />
end<br />
end<br />
if sum > Result<br />
q := q+1<br />
end;<br />
p := p+1<br />
i=p a i<br />
then Result := sum end<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 3 Einführung
Maximale Segmentsumme: systematische Lösung<br />
maxseg:INTEGER<br />
is<br />
local n, L n :INTEGER<br />
do<br />
from n := lower;<br />
Result := item(n);<br />
L n := item(n)<br />
until n >= upper<br />
invariant -- Result = M n ∧ L n = L n<br />
variant<br />
upper - n<br />
end<br />
loop<br />
if L n > 0<br />
then L n := L n + item(n)<br />
else L n := item(n)<br />
end; -- L n = L n+1<br />
if L n > Result<br />
then Result := L n<br />
end; -- Result = M n+1<br />
n := n+1<br />
end<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 4 Einführung
Softwareentwicklung ist ..<br />
logischer Schlußfolgerungsprozeß<br />
+ Kreativität<br />
+ Verarbeitung von Wissen verschiedenster Art (Erfahrung)<br />
+ fehlerfreie Codierung (Disziplin)<br />
⇒ Kooperation zwischen Mensch <strong>und</strong> Maschine sinnvoll<br />
– Steuerung des Entwicklungsprozesses durch Menschen<br />
– Korrektheitsgarantie für erzeugte Software durch Computer<br />
CASE Tools sind nicht genug<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 5 Einführung
Wissensbasiertes Software Engineering<br />
= Erzeugung formaler Spezifikationen aus Anforderungen<br />
+ Synthese von Programmen aus formalen Spezifikationen<br />
• Formalisierung von Wissen (Kalküle)<br />
– Formale Sprache<br />
– Inferenzregeln, welche logsiches Schließen simulieren<br />
• Strategien<br />
– Automatisierung des Schließens mit Kalkülen<br />
– Beweisführung + Programmerzeugung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 6 Einführung
Kalküle<br />
• Mathematik <strong>und</strong> <strong>Programmierung</strong> formalisieren<br />
Axiomatische Mengentheorie ist unkonstruktiv<br />
⇒ Konstruktive Kalküle (Intuitionistische Typentheorie)<br />
formalisieren <strong>Logik</strong>, Berechnung <strong>und</strong> Standard-Datentypen<br />
• Beweise interaktiv mit Hilfe von Computern führen<br />
denn interessante Mathematik ist unentscheidbar<br />
⇒ Proof-Checker/Beweiseditoren (NuPRL Proof Development System)<br />
• Möglichkeit der automatischen Unterstützung<br />
Taktik-Mechanismus: programmierte Beweissuche<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 7 Einführung
Strategien<br />
• Entscheidungsprozeduren für eingeschränkte Arithmetik<br />
<strong>und</strong> andere entscheidbare Teiltheorien<br />
• Theorembeweiser für eingeschränkte Anwendungsbereiche<br />
– Prädikatenlogik, Gleichheit, Induktion + Spezialanwendungen<br />
• Verfahren zur automatischen Erzeugung korrekter<br />
Programme<br />
– KIDS nahe an Routineprogrammierung<br />
– Implementierung losgelöst von formalen Kalkülen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 8 Einführung
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 2<br />
Formale Kalküle<br />
1. Kalküle – wozu?<br />
2. Syntax <strong>und</strong> Semantik formaler Sprachen<br />
3. Klassische vs. intuitionistische Mathematik<br />
4. Objekt- <strong>und</strong> Metasprache<br />
5. Definitorische Erweiterung formaler Sprachen<br />
6. Inferenzsysteme <strong>und</strong> formale Beweise<br />
– Natürliche Deduktion – Sequenzenkalküle
Kalküle<br />
Simulation mathematisch-semantischer Argumentation<br />
durch Regeln zur Symbolmanipulation<br />
• Anwendung formaler Vorschriften ohne Nachdenken<br />
– umgeht Mehrdeutigkeiten der natürlichen Sprache<br />
– schematische Lösung mathematischer Probleme<br />
• Kernbestandteile:<br />
– Formale Sprache (Syntax + Semantik)<br />
– Ableitungssystem (Regeln + Axiome)<br />
• Wichtige Eigenschaften:<br />
– korrekt + vollständig bzgl. Semantik<br />
– leicht zu verstehen<br />
– leicht zu verarbeiten (automatisierbar)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 10 Kalküle
Formale Sprachen<br />
• Syntax<br />
– Formale Struktur der Sprache<br />
– Notation, textliche Erscheinungsform<br />
– Beschreibbar durch<br />
– Mathematische Definitionsgleichungen<br />
– Formale Grammatik<br />
• Semantik<br />
– Zuordnung von Bedeutung an syntaktisch korrekte Ausdrücke<br />
Abbildung von formaler Quellsprache in informale Zielsprache<br />
– Zielsprache meist Mengentheorie<br />
– Beschreibbar durch Interpretationsfunktion<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 11 Kalküle
Syntax der Prädikatenlogik (informal)<br />
• Vordefiniert: Alphabete<br />
– Variablen-, Funktions- <strong>und</strong> Prädikatensymbole<br />
• Terme: Formalisierung mathematischer Objekte<br />
– Variablen x<br />
– Funktionsanwendung: f(t 1 , . . . , t n )<br />
• Formeln: Formalisierung mathematischer Aussagen<br />
– atomare Formel: P (t 1 , . . . , t n )<br />
– zusammengesetzte Formel:<br />
¬A, A ∧ B, A ∨ B, A ⇒ B, ∀x.A, ∃x.A, (A)<br />
• Prioritäten + Konventionen zur Abkürzung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 12 Kalküle
Semantik der Prädikatenlogik (informal)<br />
• Interpretationsfunktion weist Variablen-, Funktions- <strong>und</strong><br />
Prädikatensymbolen ein mengentheoretisches Objekt zu<br />
– Funktions- <strong>und</strong> Prädikatssymbole haben keine feste Bedeutung<br />
• Fortsetzung auf Terme <strong>und</strong> atomare Formeln<br />
– Zusammensetzung der Einzelinterpretationen zu Objekten / Aussagen<br />
• Fortsetzung auf zusammengesetzte Formeln:<br />
Negation ¬A wahr, wenn A falsch<br />
Konjunktion A ∧ B wahr, wenn A <strong>und</strong> B wahr<br />
Disjunktion A ∨ B wahr, wenn A oder B wahr<br />
Implikation A ⇒ B wahr, wenn B wahr ist, wann immer A wahr ist<br />
Universelle Quantifizierung ∀x.A wahr, wenn A für jedes x wahr<br />
Existentielle Quantifizierung ∃x.A wahr, wenn A für ein x wahr<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 13 Kalküle
Intuitionistische vs. klassische Mathematik<br />
• Begriffe “oder”, “wann immer”, “es gibt” nicht eindeutig:<br />
– Gilt A ∨ B, wenn nicht A <strong>und</strong> B falsch sind?<br />
– Gilt ∃x.A, wenn A nicht für alle x falsch ist?<br />
• Gesetz vom ausgeschlossenen Dritten: A ∨ ¬A<br />
“Eine Aussage ist wahr oder ihr Gegenteil ist wahr”<br />
Nicht: “Eine Aussage ist wahr oder falsch”!<br />
⇒ “klassische” Mathematik<br />
• intuitionistische Mathematik<br />
– lehnt das Gesetz vom ausgeschlossenen Dritten ab<br />
– versteht alle mathematischen Aussagen konstruktiv<br />
– für Schließen über Algorithmen naheliegender<br />
– Beweise werden z.T. komplizierter<br />
• Formaler Unterschied sehr gering (nur eine Regel)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 14 Kalküle
Objekt- <strong>und</strong> Metasprache<br />
• Objektsprache:<br />
– Sprache des Kalküls, in dem formalisiert wird<br />
– formale Sprache<br />
• Metasprache:<br />
– Sprache, um Aussagen über den Kalkül zu machen<br />
– natürliche Sprache<br />
+ Objektsprache<br />
+ syntaktische Metavariablen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 15 Kalküle
Definitorische Erweiterung<br />
• Erweiterung durch definitorische Abkürzung<br />
(“konservative” Erweiterung)<br />
⇒ Kleiner Gr<strong>und</strong>formalismus möglich<br />
– einfache Syntax <strong>und</strong> Semantik<br />
– einfacher Kalkül<br />
– Eigenschaften leicht beweisbar<br />
Gleichzeitig Flexibilität<br />
– umfangreiche formale Sprache<br />
– freiere Syntax<br />
• Beispiel: Äquivalenz in der Prädikatenlogik<br />
A ⇔ B ≡ (A ⇒ B) ∧ (B ⇒ A)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 16 Kalküle
Ableitungssysteme<br />
• Syntaktische Manipulation formaler Ausdrücke unter<br />
Berücksichtigung der Semantik<br />
• Konversion:<br />
– Umformung in semantisch äquivalente Ausdrücke<br />
– erhält den Wert eines Ausdrucks<br />
4+5 → 9<br />
A ∧ (A ∨ B) → A<br />
d/dx(u + v) → du/dx + dv/dx<br />
• Inferenz:<br />
– Erzeugung von logischen Konsequenzen<br />
– erhält Gültigkeit einer Aussage<br />
aus A <strong>und</strong> A ⇒ B folgt B:<br />
– Abschwächung möglich<br />
– Vielseitiger für logisches Schließen<br />
A, A ⇒ B<br />
B<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 17 Kalküle
• Regelschemata:<br />
“aus A 1 <strong>und</strong> . . . <strong>und</strong> A n<br />
} {{ }<br />
Prämissen<br />
(Inferenz)kalküle<br />
A 1 , . . . , A n<br />
C<br />
folgt<br />
}{{} C ”<br />
Konklusion<br />
Axiom: Regel ohne Prämissen<br />
• Γ ⊢ rs C: Konkrete Anwendung der Regel rs<br />
• Theorem: Ausdruck, der sich durch Anwendung von<br />
endlich vielen Regeln ableiten läßt<br />
• Korrektheit eines Kalküls: Alle Theoreme sind gültig<br />
Regeln: Gültigkeit der Konklusion folgt aus Gültigkeit der Prämissen<br />
• Vollständigkeit eines Kalküls:<br />
alle gültigen Aussagen sind Theoreme<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 18 Kalküle
Kalkülarten<br />
synthetisch/bottom-up: Schlüsse von den Axiomen zur Aussage<br />
analytisch/top-down: von der Zielaussage zu den Voraussetzungen<br />
• Frege–Hilbert–Kalküle:<br />
– viele Axiome, kaum echte Regeln; sehr mächtig;<br />
– synthetisch, Beweissuche aufwendig<br />
• Gentzens natürliches Schließen (NK / NJ)<br />
– synthetisch, nahe am natürlichen mathematischen Schließen,<br />
– kaum Axiome, 2 Regeln für jedes logische Zeichen, Verwaltung von Annahmen nötig<br />
• Sequenzenkalküle (LK / LJ)<br />
– Modifikation von NK/NJ: Schließen über Urteile statt Aussagen<br />
– lokale Sicht, keine Verwaltung von Annahmen, gut für interaktive Beweiser<br />
– synthetisch oder analytisch formulierbar<br />
• Resolutions- <strong>und</strong> Konnektionskalküle<br />
– analytisch, maschinennah, gut für automatisches Beweisen, kaum lesbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 19 Kalküle
Natürliche Deduktion (intuitionistisch)<br />
[A]<br />
Λ-E<br />
Λ<br />
A<br />
¬-I<br />
Λ<br />
¬A<br />
¬-E<br />
¬A A<br />
Λ<br />
∧ -I<br />
A B<br />
A ∧ B<br />
∧ -E<br />
A ∧ B<br />
A<br />
A ∧ B<br />
B<br />
∨ -I<br />
A<br />
A ∨ B<br />
B<br />
A ∨ B<br />
∨ -E<br />
A ∨ B<br />
[A]<br />
C<br />
C<br />
[B]<br />
C<br />
[A]<br />
⇒ -I<br />
B<br />
A ⇒ B<br />
⇒ -E<br />
A A ⇒ B<br />
B<br />
Einführungsregel –I: unter welchen Voraussetzungen ist eine Formel gültig?<br />
Eliminationsregel (–E): was folgt aus einer gegebenen Formel?<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 20 Kalküle
((A ⇒ B) ∧ (B ⇒ C)) ⇒ (A ⇒ C)<br />
mathematischer Beweis<br />
1. Wir nehmen an (A ⇒ B) ∧ (B ⇒ C) sei erfüllt<br />
2. Wir nehmen weiter an, daß A gilt.<br />
3. Aus der ersten Annahme folgt (A ⇒ B)<br />
4. <strong>und</strong> mit der zweiten dann auch B.<br />
5. Aus der ersten Annahme folgt auch, daß (B ⇒ C) gilt<br />
6. <strong>und</strong> mit der vierten dann auch C.<br />
7. Es ergibt sich, daß C unter der Annahme A gilt. Also folgt A ⇒ C<br />
8. Insgesamt folgt A ⇒ C unter der Annahme (A ⇒ B) ∧ (B ⇒ C).<br />
Damit gilt die Behauptung: ((A ⇒ B) ∧ (B ⇒ C)) ⇒ (A ⇒ C)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 21 Kalküle
((A ⇒ B) ∧ (B ⇒ C)) ⇒ (A ⇒ C)<br />
Beweis in NK<br />
(1) (A ⇒ B) ∧ (B ⇒ C) Annahme<br />
(2) A Annahme<br />
(3) (A ⇒ B) ∧ -E mit (1)<br />
(4) B ⇒ -E mit (2) <strong>und</strong> (3)<br />
(5) (B ⇒ C) ∧ -E mit (1)<br />
(6) C ⇒ -E mit (4) <strong>und</strong> (5)<br />
(7) (A ⇒ C) ⇒ -I mit (2) <strong>und</strong> (6) — (2) entfällt<br />
(8) (A ⇒ B) ∧ (B ⇒ C) ⇒ (A ⇒ C) ⇒ -I mit (1) <strong>und</strong> (7) — (1) entfällt<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 22 Kalküle
Sequenzenkalküle<br />
• Sequenz:<br />
A 1 , . . . , A n ⊢ C<br />
“Formel C folgt aus den Annahmen A 1 ,. . . ,A n ” (Urteil)<br />
• Regeln manipulieren Sequenzen statt Formeln<br />
• Eliminationsregeln = Einführungsregeln für Annahmen<br />
A ∧ B<br />
A<br />
→<br />
Γ,A ⊢ C<br />
Γ,A ∧ B ⊢ C<br />
• analytische Version = Umkehrung + Kontrollparameter<br />
Γ,A ∧ B ⊢ C<br />
Γ,A,B ⊢ C<br />
and elim<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 23 Kalküle
Sequenzenkalkül für Aussagenlogik<br />
Axiom Γ,A ⊢ A<br />
Schnitt<br />
Γ ⊢ A ∆,A ⊢ C<br />
Γ,∆ ⊢ C<br />
Λ-E<br />
Γ, Λ ⊢ A<br />
¬-I<br />
Γ, A ⊢ Λ<br />
Γ, ⊢ ¬A<br />
¬-E<br />
Γ ⊢ A<br />
Γ,¬A ⊢ Λ<br />
∧ -I<br />
Γ⊢A Γ⊢B<br />
Γ ⊢ A ∧ B<br />
∧ -E<br />
Γ,A ⊢ C<br />
Γ,A ∧ B ⊢ C<br />
Γ,B ⊢ C<br />
Γ,A ∧ B ⊢ C<br />
∨ -I<br />
Γ ⊢ A<br />
Γ ⊢ A ∨ B<br />
Γ ⊢ B<br />
Γ ⊢ A ∨ B<br />
∨ -E<br />
Γ,A ⊢ C Γ,B ⊢ C<br />
Γ,A ∨ B ⊢ C<br />
⇒ -I<br />
Γ, A ⊢ B<br />
Γ ⊢ A ⇒ B<br />
⇒ -E<br />
Γ ⊢ A ∆,B ⊢ C<br />
Γ,∆,A ⇒ B ⊢ C<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 24 Kalküle
((A ⇒ B) ∧ (B ⇒ C)) ⇒ (A ⇒ C)<br />
Sequenzenbeweis<br />
(1) A ⊢ A Axiom<br />
(2) B ⊢ B Axiom<br />
(3) A, A ⇒ B ⊢ B ⇒ -E mit (1), (2)<br />
(4) C ⊢ C Axiom<br />
(5) A, A ⇒ B, B ⇒ C ⊢ C ⇒ -E mit (3), (4)<br />
(6) A, (A ⇒ B) ∧ (B ⇒ C) ⊢ C ∧ -E<br />
(6’) (A ⇒ B) ∧ (B ⇒ C), A ⊢ C – Vertauschung –<br />
(7) (A ⇒ B) ∧ (B ⇒ C) ⊢ A ⇒ C ⇒ -I<br />
(8) ⊢ (A ⇒ B) ∧ (B ⇒ C) ⇒ (A ⇒ C) ⇒ -I<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 25 Kalküle
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 3<br />
Prädikatenlogik<br />
1. Syntax<br />
2. Semantik<br />
3. Analytische Sequenzenbeweise<br />
– strukturelle Regeln<br />
– aussagenlogische Regeln<br />
– Quantoren<br />
– Gleichheit<br />
– Eigenschaften des Beweiskalküls<br />
4. Beweismethodik
Prädikatenlogik erster Stufe – Terme<br />
V: Alphabet von Variablen(-symbolen)<br />
F i : Alphabet von i-stelligen Funktionssymbolen<br />
F = ⋃ ∞<br />
i=0<br />
F i<br />
• x Term, falls x ∈ V<br />
• f Term (Konstante), falls f ∈ F 0<br />
• f(t 1 ,. . .,t n ) Term, falls t 1 , .., t n Terme <strong>und</strong> f ∈ F n<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 27 Prädikatenlogik
Prädikatenlogik erster Stufe (mit Sorten) – Formeln<br />
P i : Alphabet von i-stelligen Prädikatssymbolen<br />
P = ⋃ ∞<br />
i=0<br />
P i<br />
T : Alphabet von Bereichssymbolen (Typen)<br />
• Λ (atomare) Formel.<br />
• P atomare Formel (Aussagenvariable), falls P ∈ P 0<br />
• t 1 = t 2 atomare Formel, falls t 1 <strong>und</strong> t 2 Terme<br />
• P (t 1 ,. . .,t n ) atomare Formel, falls t 1 , .., t n Terme, P ∈ P n<br />
• ¬A, A ∧ B, A ∨ B, A ⇒ B, ∀x:T .A, ∃x:T .A, (A)<br />
Formeln, falls A, B Formeln, x ∈ V <strong>und</strong> T ∈ T<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 28 Prädikatenlogik
Prädikatenlogik erster Stufe – Semantik I<br />
• Interpretation: Universum U + Interpretationsfunktion ι<br />
– ι(x) Objekt aus U (x ∈ V)<br />
– ι(f) n-stellige Funktion φ : U n →U (f ∈ F n )<br />
– ι(T ) Teilmenge von U (T ∈ T )<br />
– ι(P ) Funktion Π : U n ↛{wahr, falsch} (P ∈ P n )<br />
• ι(f(t 1 ,. . .,t n )) = ι(f)( ι(t 1 ), . . . , ι(t n ) ).<br />
• ι(Λ) = falsch<br />
{<br />
• ι(t 1 = t 2 ) =<br />
wahr<br />
falsch sonst<br />
falls ι(t 1 ) <strong>und</strong> ι(t 2 ) in U gleich<br />
• ι(P (t 1 ,. . .,t n )) = ι(P )( ι(t 1 ), . . . , ι(t n ) ).<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 29 Prädikatenlogik
Prädikatenlogik erster Stufe – Semantik II<br />
{<br />
ι(¬A)<br />
wahr falls ι(A) = falsch<br />
=<br />
falsch sonst<br />
{<br />
ι(A ∧ B)<br />
wahr falls ι(A) = wahr <strong>und</strong> ι(B) = wahr<br />
=<br />
falsch sonst<br />
{<br />
ι(A ∨ B)<br />
wahr falls ι(A) = wahr oder ι(B) = wahr<br />
=<br />
falsch sonst<br />
{<br />
wahr falls aus ι(A) = wahr immer ι(B) = wahr folgt<br />
ι(A ⇒ B) =<br />
falsch sonst<br />
{<br />
wahr falls ι<br />
u<br />
ι(∀x:T .A) =<br />
x<br />
(A) = wahr für alle u ∈ ι(T )<br />
falsch sonst (ι u x (x) = u, sonst ιu x<br />
{<br />
= ι)<br />
ι(∃x:T .A) =<br />
wahr falls ι u x (A) = wahr für ein u ∈ ι(T )<br />
falsch sonst<br />
ι((A)) = ι(A)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 30 Prädikatenlogik
Prädikatenlogik – klassische Semantik<br />
ι(A ∨ B) =<br />
ι(A ⇒ B) =<br />
ι(∃x:T .A) =<br />
{<br />
{<br />
{<br />
falsch falls ι(A) = falsch <strong>und</strong> ι(B) = falsch<br />
wahr sonst<br />
falsch falls ι(A) = wahr <strong>und</strong> ι(B) = falsch<br />
wahr sonst<br />
falsch falls ι u x (A) = falsch für alle u ∈ ι(T )<br />
wahr sonst<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 31 Prädikatenlogik
Modelle <strong>und</strong> Gültigkeit<br />
• Modell von A: Interpretation (ι,U) mit ι(A) = wahr<br />
• A erfüllbar, wenn es ein Modell für A gibt,<br />
• A widerlegbar, wenn es ein Modell für ¬A gibt,<br />
• A widersprüchlich, wenn es für A kein Modell gibt,<br />
• A gültig, wenn jede Interpretation Modell für A ist.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 32 Prädikatenlogik
Sequenzenbeweise<br />
• Deklaration x:T (x ∈ V, T ∈ T )<br />
• Sequenz Γ ⊢ C<br />
– Γ Hypothesenliste von Formeln oder Deklarationen<br />
– C Formel (Konklusion)<br />
• Inferenzregel: Abbildung von Beweisziel in Teilziele<br />
– Sequenz in endliche Liste von Sequenzen<br />
• Beweis: Baum mit Sequenz+Regel als Knoten<br />
– Nachfolger eines Knotens sind Teilziele der Regelanwendung auf Sequenz<br />
unvollständiger Beweis: manche Blätter ohne Regel<br />
vollständiger Beweis: Regeln der Blätter ohne Teilziele<br />
• C Theorem: es gibt vollständigen Beweis für ‘ ⊢ C’<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 33 Prädikatenlogik
Interpretation von Sequenzen<br />
ι(x:T ) = wahr für jede Deklaration<br />
⎧<br />
wahr falls aus ι(A 1 ) = wahr<br />
⎪⎨<br />
<strong>und</strong> . . . ι(A n ) = wahr<br />
ι(A 1 ,...,A n ⊢ C) =<br />
immer ι(C) = wahr folgt<br />
⎪⎩<br />
falsch sonst<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 34 Prädikatenlogik
Sequenzenkalkül – Strukturelle Regeln<br />
Γ,C,∆ ⊢ C<br />
by hypothesis i<br />
Γ,∆ ⊢ C by cut i A<br />
Γ,∆ ⊢ A<br />
Γ,A,∆ ⊢ C<br />
Γ,A,∆ ⊢ C<br />
Γ,∆ ⊢ C<br />
by thin i<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 35 Prädikatenlogik
Sequenzenkalkül – Aussagenlogische Regeln<br />
Γ ⊢ A ∧ B by and i<br />
Γ ⊢ A<br />
Γ ⊢ B<br />
Γ ⊢ A ∨ B by or i1<br />
Γ ⊢ A<br />
Γ ⊢ A ∨ B by or i2<br />
Γ ⊢ B<br />
Γ ⊢ A ⇒ B by imp i<br />
Γ,A ⊢ B<br />
Γ ⊢ ¬A by not i<br />
Γ,A ⊢ Λ<br />
Γ ⊢ C by classical contradiction<br />
Γ, ¬C ⊢ Λ<br />
Γ,A ∧ B,∆ ⊢ C by and e i<br />
Γ,A,B,∆ ⊢ C<br />
Γ,A ∨ B,∆ ⊢ C by or e i<br />
Γ,A,∆ ⊢ C<br />
Γ,B,∆ ⊢ C<br />
Γ,A ⇒ B ⊢ C by imp e i<br />
Γ,A ⇒ B,∆ ⊢ A<br />
Γ,∆,B ⊢ C<br />
Γ,¬A,∆ ⊢ C by not e i<br />
Γ,¬A,∆ ⊢ A<br />
Γ,∆,Λ ⊢ C<br />
Γ,Λ,∆ ⊢ C by false e i<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 36 Prädikatenlogik
Freies <strong>und</strong> geb<strong>und</strong>enes Vorkommen von Variablen<br />
• x: die Variable x kommt frei vor; y ≠ x kommt nicht vor.<br />
• f(t 1 , ..., t n ): freie Vorkommen von x in t i bleiben frei, geb<strong>und</strong>ene Vorkommen<br />
von x bleiben geb<strong>und</strong>en.<br />
• Λ: x kommt nicht vor<br />
• t 1 =t 2 freie Vorkommen von x in t i bleiben frei, geb<strong>und</strong>ene Vorkommen von x<br />
bleiben geb<strong>und</strong>en.<br />
• P (t 1 , ..., t n ) freie Vorkommen von x in t i bleiben frei, geb<strong>und</strong>ene Vorkommen<br />
von x bleiben geb<strong>und</strong>en.<br />
• ¬A, A ∧ B, A ∨ B, A ⇒ B, (A): freie Vorkommen von x in A, B bleiben<br />
frei, geb<strong>und</strong>ene Vorkommen von x bleiben geb<strong>und</strong>en.<br />
• ∀x:T .A, ∃x:T .A: freie <strong>und</strong> geb<strong>und</strong>ene Vorkommen von x in A werden<br />
geb<strong>und</strong>en; freie Vorkommen von y ≠ x in A bleiben frei, geb<strong>und</strong>ene<br />
Vorkommen von y bleiben geb<strong>und</strong>en.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 37 Prädikatenlogik
Substitution<br />
endliche Abbildung σ von Variablen in Terme<br />
σ = [t 1 , . . . , t n /x 1 , . . . , x n ] ˆ= σ(x 1 )=t 1 , . . . , σ(x n )=t n<br />
P A[t/x]: Anwendung von σ=[t/x] auf Ausdruck P A<br />
x[t/x] = t x[t/y] = x (y ≠ x)<br />
f(t 1 , .., t n )[t/x] = f(t 1 [t/x], .., t n [t/x])<br />
Λ[t/x] = Λ t 1 =t 2 [t/x] = t 1 [t/x]=t 2 [t/x].<br />
P (t 1 , .., t n )[t/x] = P (t 1 [t/x], .., t n [t/x])<br />
¬A[t/x] = ¬A[t/x], A ∧ B[t/x] = A[t/x] ∧ B[t/x],<br />
A ∨ B[t/x] = A[t/x] ∨ B[t/x], A ⇒ B[t/x] = A[t/x] ⇒ B[t/x],<br />
(A)[t/x] = (A[t/x])<br />
∀x:T .A[t/x] = ∀x:T .A ∃x:T .A[t/x] = ∃x:T .A<br />
∀x:T .A[t/y] = (∀z:T .A[z/x])[t/y] ∃x:T .A[t/y] = (∃z:T .A[z/x])[t/y]<br />
y ≠ x, y frei in A, x frei in t, z neue Variable.<br />
∀x:T .A[t/y] = ∀x:T .A[t/y] ∃x:T .A[t/y] = ∃x:T .A[t/y],<br />
y ≠ x, y nicht frei in A oder x nicht frei in t<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 38 Prädikatenlogik
Sequenzenkalkül – Quantorregeln + Gleichheit<br />
Γ ⊢ ∀x:T .A by all i ∗<br />
Γ,x ′ :T ⊢ A[x ′ /x]<br />
Γ,∀x:T .A,∆ ⊢ C by all e i t<br />
Γ,∀x:T .A,∆,A[t/x] ⊢ C<br />
Γ ⊢ ∃x:T .A<br />
Γ ⊢ A[t/x]<br />
by ex i t<br />
Γ,∃x:T .A,∆ ⊢ C by ex e i ∗∗<br />
Γ,x ′ :T ,A[x ′ /x],∆ ⊢ C<br />
Γ ⊢ t=t by reflexivity Γ ⊢ t 1 =t 2 by symmetry<br />
Γ ⊢ t 2 =t 1<br />
Γ ⊢ A[t 1 /x] by substitution t 1 =t 2<br />
Γ ⊢ t 1 =t 2 by transitivity u<br />
Γ ⊢ u=t 2 Γ ⊢ A[t 2 /x]<br />
Γ ⊢ t 1 =u<br />
Γ ⊢ t 1 =t 2<br />
∗ : Die Umbenennung [x ′ /x] erfolgt, wenn x in Γ frei vorkommt<br />
∗∗ : Die Umbenennung [x ′ /x] erfolgt, wenn x in C frei vorkommt.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 39 Prädikatenlogik
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 4<br />
λ-Kalkül<br />
1. Syntax<br />
2. Operationale Semantik<br />
3. Standard-Erweiterungen<br />
4. Ein Kalkül zum Schließen über Berechnung<br />
5. Ausdruckskraft des λ-Kalküls<br />
6. Eigenschaften des λ-Kalküls
λ-Terme – Syntax<br />
V: Alphabet von Variablen(-symbolen)<br />
• x<br />
λ-Term, falls x ∈ V<br />
• λx.t<br />
λ-Term, falls x ∈ V <strong>und</strong> t λ-Term λ-Abstraktion<br />
• f t λ-Term, falls t <strong>und</strong> f λ-Terme<br />
Applikation<br />
• (t)<br />
λ-Term, falls t λ-Term<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 41 λ-Kalkül
Freies <strong>und</strong> geb<strong>und</strong>enes Vorkommen von Variablen<br />
• x: die Variable x kommt frei vor; y ≠ x kommt nicht vor.<br />
• λx.t: freie <strong>und</strong> geb<strong>und</strong>ene Vorkommen von x in t werden<br />
geb<strong>und</strong>en; freie Vorkommen von y ≠ x in t bleiben frei,<br />
geb<strong>und</strong>ene Vorkommen von y bleiben geb<strong>und</strong>en.<br />
• f t: freie Vorkommen von x in f <strong>und</strong> t bleiben frei, geb<strong>und</strong>ene<br />
Vorkommen von x bleiben geb<strong>und</strong>en.<br />
• (t): freie Vorkommen von x in t bleiben frei, geb<strong>und</strong>ene<br />
Vorkommen von x bleiben geb<strong>und</strong>en.<br />
t[x 1 , . . . , x n ]: x 1 , . . . , x n kommen frei in t vor<br />
t geschlossen, falls t keine freien Variablen enthält<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 42 λ-Kalkül
Substitution in λ-Termen<br />
x[t/x] = t x[t/y] = x (y ≠ x)<br />
λx.u[t/x] =<br />
λx.u[t/y] =<br />
λx.u<br />
λx.u[t/y]<br />
y ≠ x, y nicht frei in t oder x nicht frei in t<br />
λx.u[t/y] = (λz.u[z/x])[t/y]<br />
y ≠ x, y frei in t, x frei in t, z neue Variable.<br />
f u[t/x] = f[t/x] u[t/x]<br />
(u)[t/x] = (u[t/x])<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 43 λ-Kalkül
Konversion <strong>und</strong> Reduktion – informal<br />
• Umbenennung geb<strong>und</strong>ener Variablen in t (α-Konversion):<br />
Ersetzung eines Teilterms der Gestalt λx.u durch den<br />
Term λz.u[z/x], (z neue Variable)<br />
• t <strong>und</strong> u kongruent (α-konvertibel): u ergibt sich aus t<br />
durch endlich viele Umbenennungen geb<strong>und</strong>ener<br />
Variablen<br />
• Reduktion von t: Ersetzung eines Teiltermes der Gestalt<br />
• t<br />
(λx.u)(s) (Redex) durch u[s/x] (Kontraktum)<br />
∗<br />
−→ u (t reduzierbar auf u): u ergibt sich aus t durch<br />
endlich viele Reduktionen <strong>und</strong> α-Konversionen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 44 λ-Kalkül
Konversion ∼ = – formal<br />
• λx.u ∼ = λz.u[z/x], (z neue Variable)<br />
• f t ∼ = f u, falls t ∼ = u<br />
• f t ∼ = g t, falls f ∼ = g<br />
• λx.t ∼ = λx.u, falls t ∼ = u<br />
• t ∼ = t<br />
• t ∼ = u, falls u ∼ = t<br />
• t ∼ = u, falls t ∼ = s <strong>und</strong> s ∼ = u<br />
α-Konversion<br />
µ-Konversion<br />
ν-Konversion<br />
ξ-Konversion<br />
ρ-Konversion<br />
σ-Konversion<br />
τ -Konversion<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 45 λ-Kalkül
Reduktion −→ – formal<br />
• (λx.u) s −→ u[s/x]<br />
β-Reduktion<br />
• f t −→ f u, falls t −→ u<br />
• f t −→ g t, falls f<br />
−→ g<br />
• λx.t −→ λx.u, falls t −→ u<br />
• t −→ u, falls t −→ s <strong>und</strong> s ∼ = u<br />
oder t ∼ = s <strong>und</strong> s −→ u<br />
t<br />
– t<br />
∗<br />
−→ u, falls t<br />
0<br />
−→ u, falls t ∼ =u,<br />
n<br />
– t n+1<br />
−→ u, falls t −→ s <strong>und</strong> s<br />
−→ u für ein n ∈ N.<br />
1<br />
t −→ u, falls t −→ u<br />
−→ n<br />
u<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 46 λ-Kalkül
Boolesche Operatoren / Operatoren auf Paaren<br />
T ≡ ≡ λx.λy.x<br />
F ≡ ≡ λx.λy.y<br />
if b then s else t ≡ cond(b;s;t) ≡ b s t<br />
〈s,t〉 ≡ pair(s,t) ≡ λp. p s t<br />
pair.1 ≡ pi1(pair) ≡ pair (λx.λy.x)<br />
pair.2 ≡ pi2(pair) ≡ pair (λx.λy.y)<br />
let 〈x,y〉 = pair in t ≡ spread(pair; x,y.t) ≡ pair (λx.λy.t)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 47 λ-Kalkül
Zahlen (Church Numerals) <strong>und</strong> Listen<br />
n ≡ λf.λx. f n x ≡ λf.λx. f (f ...(f x) ...)<br />
} {{ }<br />
n-mal<br />
s ≡ λn.λf.λx. n f (f x)<br />
add ≡ λm.λn.λf.λx. m f (n f x)<br />
mul<br />
exp<br />
zero<br />
≡ λm.λn.λf.λx. m (n f) x<br />
≡ λm.λn.λf.λx. n m f x<br />
≡ λn. n (λn.F) T<br />
p ≡ λn. (n (λfx. 〈s, let 〈f,x〉 = fx in f x〉) 〈λz.0, 0〉).2<br />
PRs[b,h]<br />
≡ λn. n h b<br />
[] ≡ λf.λx.x<br />
cons(t,list) ≡ λf.λx. f t (list f x)<br />
t.list<br />
≡ cons(t,list)<br />
list ind[b,h] ≡ λlist. list h b<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 48 λ-Kalkül
Rekursion im λ-Kalkül<br />
• Fixpunktkombinator (Rekursor): λ-Term R mit der<br />
Eigenschaft, daß für beliebige t gilt:<br />
R(t) = t( R(t) )<br />
• Y ≡ λf. (λx. f (x x)) (λx. f (x x)) ist ein<br />
Fixpunktkombinator<br />
• letrec f(x) = t ≡ Y(λf.λx.t)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 49 λ-Kalkül
Kalkül zum Schließen über Berechnungen<br />
t=u: es gibt v mit t<br />
∗<br />
−→ v <strong>und</strong> u<br />
∗ −→ v.<br />
(t <strong>und</strong> u semantisch gleich / konvertierbar)<br />
Γ ⊢ f t = g u<br />
Γ ⊢ f = g<br />
Γ ⊢ t = u<br />
by apply eq<br />
Γ ⊢ λx.t = λy.u by lambda eq ∗<br />
Γ, x ′ :U ⊢ t[x ′ /x] = u[x ′ /y]<br />
Γ ⊢ (λx.u) s = t<br />
u[s/x] = t<br />
by reduction<br />
Γ ⊢ t=t by reflexivity Γ ⊢ t 1 =t 2 by symmetry<br />
Γ ⊢ t 1 =t 2 by transitivity u<br />
Γ ⊢ t 1 =u<br />
Γ ⊢ t 2 =t 1<br />
Γ ⊢ u=t 2<br />
∗ : Die Umbenennung [x ′ /x] erfolgt, wenn x in Γ frei vorkommt.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 50 λ-Kalkül
µ-rekursive Funktionen<br />
1. Konstanten 0, 1, 2, . . . – (nullstellige Funktionen)<br />
2. Nullfunktion z mit z(n) = 0 für alle n ∈ N<br />
3. Nachfolgerfunktion s mit s(n) = n + 1 für alle n ∈ N<br />
4. Projektionsfunktionen pr n m mit prn m (x 1, ..., x n ) = x m<br />
5. Komposition Cn[f, g 1 ...g n ] der Funktionen f, g 1 ...g n :<br />
h = Cn[f, g 1 ...g n ], wenn h(⃗x) = f( g 1 (⃗x), ..., g n (⃗x) )<br />
6. primitive Rekursion P r[f, g] zweier Funktionen f <strong>und</strong> g:<br />
h = P r[f, g], wenn<br />
h(⃗x, 0) = f(⃗x) , h(⃗x, y + 1) = g(⃗x, y, h(⃗x, y))<br />
7. Minimierung<br />
⎧<br />
Mn[f] einer Funktion f: h = Mn[f], wenn<br />
⎪⎨ min{y | f(⃗x, y) = 0} falls dies existiert <strong>und</strong><br />
h(⃗x) =<br />
alle f(⃗x, i), i < y definiert<br />
⎪⎩ <strong>und</strong>efiniert<br />
sonst<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 51 λ-Kalkül
Ausdruckskraft des λ-Kalküls<br />
• f:N n →N λ-berechenbar, wenn es einen λ-Term t gibt mit:<br />
f(x 1 , ..., x n ) = m ⇔ t x 1 ...x n = m<br />
⇒ Die Klasse der λ-berechenbaren Funktionen ist identisch mit der Klasse<br />
der µ-rekursiven Funktionen.<br />
1. Konstanten 0, 1, 2, . . . ∈ N: Church-Numerals 0,1,2,. . .<br />
2. Nullfunktion z: λn.0<br />
3. Nachfolgerfunktion s: s<br />
4. Projektionsfunktionen prm n : λx ....λx 1 n.x m<br />
5. Komposition Cn[f, g 1 , .., g n ]:<br />
Cn ≡ λf.λg 1<br />
....λg n<br />
. λ⃗x. f (g 1<br />
⃗x) ...(g n<br />
⃗x)<br />
6. Primitive Rekursion P r[f, g]:<br />
Pr ≡ λf.λg. Y (λh.λ⃗x.λy. if zero y then f⃗x else g ⃗x (p y) (h⃗x (p y)) )<br />
7. Minimierung Mn[f]:<br />
Mn ≡ λf.λ⃗x. ( Y (λmin.λy. if zero(f⃗x y) then y else min (s y) ) ) 0<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 52 λ-Kalkül
Normalform<br />
• t in Normalform, wenn t keine Redizes enthält<br />
• t normalisierbar, wenn t auf einen λ-Term in<br />
Normalform reduziert werden kann<br />
• t Normalform von s, wenn t in Normalform <strong>und</strong><br />
s −→ ∗ t<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 53 λ-Kalkül
Eigenschaften des λ-Kalküls<br />
• Es gibt λ-Terme ohne Normalform<br />
– (λx. x x) (λx. x x)<br />
• Es gibt normalisierbare λ-Terme, bei denen nicht jede<br />
Reduktionsfolge zu einer Normalform führt<br />
– (λx.λy.y) ((λx. x x x) (λx. x x x)) (λx. x)<br />
• Ist ein λ-Term normalisierbar, so kann man die Normalform<br />
durch Reduktion des jeweils äußersten Redex bestimmen.<br />
• Die Normalform eines λ-Terms ist eindeutig<br />
Church-Rosser Theorem: Gilt t −→ u <strong>und</strong> t −→ v,<br />
so gibt es einen λ-Term s mit u −→ ∗<br />
s <strong>und</strong> v −→ ∗<br />
s.<br />
• Satz von Rice: Alle nichttrivialen extensionalen<br />
Eigenschaften von λ-Termen sind unentscheidbar.<br />
∗<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 54 λ-Kalkül<br />
∗
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 5<br />
Die einfache Typentheorie I<br />
1. Syntax, Semantik <strong>und</strong> Typzugehörigkeit<br />
2. Formales Schließen über Typzugehörigkeit<br />
3. Ein Typechecking Algorithmus
Typentheorie – Syntax<br />
Typ-Ausdrücke:<br />
• T (atomarer) Typ, wenn T ∈ T (Alphabet von Bereichssymbolen)<br />
• S→T<br />
Typ, falls S <strong>und</strong> T Typen<br />
• (T ) Typ, falls T Typ<br />
→ ist rechtsassoziativ<br />
Objekt-Ausdrücke sind λ-Terme<br />
• x λ-Term, falls x ∈ V (Alphabet von Variablen)<br />
• λx.t λ-Term, falls x ∈ V <strong>und</strong> t λ-Term<br />
• f t λ-Term, falls t <strong>und</strong> f λ-Terme<br />
• (t) λ-Term, falls t λ-Term<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 56 Einfache Typentheorie
Typzugehörigkeit<br />
Typzugehörigkeitsrelation t ∈ T :<br />
• x ∈ T , falls x ∈ V <strong>und</strong> T ein Typ<br />
• λx.t ∈ S→T , falls t ∈ T aus x ∈ S folgt<br />
• f t ∈ T , falls f ∈ S→T <strong>und</strong> t ∈ S für einen Typ S.<br />
• (t) ∈ T , falls t ∈ T<br />
• t ∈ (T ), falls t ∈ T<br />
t typisierbar, falls es einen Typ T gibt mit t ∈ T .<br />
prinzipielles Typschema von t: kleinster Typ T mit t ∈ T<br />
Sind t <strong>und</strong> t ′ semantisch gleich, so gilt t ∈ T ⇔ t ′ ∈ T<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 57 Einfache Typentheorie
Kalkül zum Schließen über Typzugehörigkeit<br />
Γ ⊢ λx.t ∈ S→T by lambda i ∗<br />
Γ, x ′ :S ⊢ t[x ′ /x] ∈ T<br />
Γ ⊢ S ∈ U<br />
Γ ⊢ f t ∈ T by apply i S<br />
Γ ⊢ f ∈ S→T<br />
Γ ⊢ t ∈ S<br />
Γ ⊢ S→T ∈ U<br />
Γ ⊢ S ∈ U<br />
Γ ⊢ T ∈ U<br />
by function i<br />
Γ, x:T , ∆ ⊢ x ∈ T by declaration i<br />
∗ : Umbenennung [x ′ /x], wenn x in Γ frei vorkommt<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 58 Einfache Typentheorie
Deklaration, Typisierungen, Sequenzen<br />
• Festes Symbol U (Universum aller Typen)<br />
• Deklaration<br />
x:X (Variablendeklaration) oder T :U (Typdeklaration)<br />
• Typisierung: t ∈ T oder T ∈ U<br />
• Sequenz Γ ⊢ C<br />
– Γ Hypothesenliste von Deklarationen<br />
– C Typisierung (Konklusion)<br />
• Γ rein: jeder Bezeichner genau einmal deklariert, Bezeichner T ,<br />
der rechts in Deklaration erscheint, zuvor deklariert durch T :U<br />
• Initialsequenz: Sequenz Γ ⊢ t ∈ T , Γ rein, Γ deklariert alle in T<br />
vorkommenden Bezeichner <strong>und</strong> sonst keine<br />
• Inferenzregel, Beweis etc. wie zuvor<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 59 Einfache Typentheorie
Sequenzenbeweis für (λf.λx. f x)(λz.z) ∈<br />
T→T<br />
T:U ⊢ (λf.λx. f x)(λz.z) ∈ T→T by apply i T→T<br />
|\<br />
| T:U ⊢ λf.λx. f x ∈ (T→T) → (T→T) by lambda i<br />
| |\<br />
| | T:U, f:T→T ⊢ λx. f x ∈ T→T by lambda i<br />
| | |\<br />
| | | T:U, f:T→T, x:T ⊢ f x ∈ T by apply i T<br />
| | | |\<br />
| | | | T:U, f:T→T, x:T ⊢ f ∈ T→T by declaration 2<br />
| | | \<br />
| | | T:U, f:T→T, x:T ⊢ x ∈ T by declaration 3<br />
| | \<br />
| | T:U, f:T→T ⊢ T ∈ U by declaration 1<br />
| \<br />
| T:U ⊢ T→T ∈ U by function i<br />
| |\<br />
| | T:U ⊢ T ∈ U by declaration 1<br />
| \<br />
| T:U ⊢ T ∈ U by declaration 1<br />
\<br />
T:U ⊢ λz.z ∈ T→T by lambda i<br />
|\<br />
| T:U, z:T ⊢ z ∈ T by declaration 2<br />
\<br />
T:U ⊢ T ∈ U by declaration 1<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 60 Einfache Typentheorie
Hindley-Milner Typechecking Algorithmus<br />
Eingabe: geschlossener λ-Term t<br />
Ausgabe: prinzipielles Typschema von t oder Fehlermeldung<br />
Start: σ:=[]; TYPE-OF([], t)<br />
Algorithmus TYPE-OF(Env,t) :<br />
Falls t=x ∈ V: suche Deklaration x:T in Env <strong>und</strong> gebe T aus<br />
Falls t=f u:<br />
S 1 :=TYPE-OF(Env,f); S 2 :=TYPE-OF(Env,u)<br />
Wähle neues X i+1 <strong>und</strong> unifiziere σ(S 1 ) mit S 2 →X i+1 .<br />
Falls Unifikation fehlschlägt, breche mit Fehlermeldung ab.<br />
Sonst σ := σ ′ ◦σ (σ ′ Unifikationsergebnis) Ausgabe σ(X i+1 )<br />
Falls t=λx.u:<br />
{<br />
Wähle neues X i+1<br />
TYPE-OF(Env·[x:X i+1 ],u) falls x nicht in Env<br />
S 1 :=<br />
TYPE-OF(Env·[x ′ :X i+1 ],u[x ′ /x]) sonst (x ′ ∈ V neu)<br />
Ausgabe σ(X i+1 )→S 1<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 61 Einfache Typentheorie
Typisierung von λf.λx. f(f(f x))<br />
Env Aktueller Term t σ UNIFY Typ<br />
λf.λx. f(f(f x))<br />
f:X 0<br />
λx. f(f(f x))<br />
f:X 0<br />
, x:X 1<br />
f(f(f x))<br />
f:X 0<br />
, x:X 1<br />
f X 0<br />
f:X 0<br />
, x:X 1<br />
f(f x)<br />
f:X 0<br />
, x:X 1<br />
f X 0<br />
f:X 0<br />
, x:X 1<br />
f x<br />
f:X 0<br />
, x:X 1<br />
f X 0<br />
f:X 0<br />
, x:X 1<br />
x X 1<br />
f:X 0<br />
, x:X 1<br />
f x X 0<br />
= X 1<br />
→X 2<br />
X 2<br />
f:X 0<br />
, x:X 1<br />
f(f x) [X 1<br />
→X 2<br />
/X 0<br />
] X 1<br />
→X 2<br />
= X 2<br />
→X 3<br />
X 3<br />
f:X 0<br />
, x:X 1<br />
f(f(f x)) [X 3<br />
,X 3<br />
,X 3<br />
→X 3<br />
/ X 2<br />
,X 1<br />
,X 0<br />
] X 3<br />
→X 3<br />
= X 3<br />
→X 4 X 4<br />
f:X 0<br />
λx. f(f(f x)) [X 4 ,X 4 ,X 4 ,X 4 →X 4 / X 3<br />
,X 2<br />
,X 1<br />
,X 0<br />
] X 4 →X 4<br />
λf.λx. f(f(f x)) [X 4 ,X 4 ,X 4 ,X 4 →X 4 / X 3<br />
,X 2<br />
,X 1<br />
,X 0<br />
] (X 4 →X 4 ) → X 4 →X 4<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 62 Einfache Typentheorie
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 6<br />
Die einfache Typentheorie II<br />
1. Eigenschaften typisierbarer λ-Terme<br />
– Schwache Normalisierbarkeit<br />
– Starke Normalisierbarkeit<br />
– Konfluenz<br />
– Entscheidbarkeit<br />
2. Schließen über den Wert getypter λ-Terme<br />
3. Die Curry-Howard Isomorphie<br />
4. Die Ausdruckskraft typisierbarer λ-Terme
Eigenschaften typisierbarer Terme<br />
• Schwache Normalisierbarkeit<br />
– jeder Term hat Normalform<br />
– alle Funktionen total<br />
• Starke Normalisierbarkeit<br />
– jede Reduktionsfolge terminiert<br />
• Konfluenz / Church-Rosser Theorem<br />
– Reduktionsfolgen wieder zusammenführbar<br />
– jede Normalform ist eindeutig<br />
• Entscheidungsprozeduren<br />
– Typisierbarkeit<br />
– Gleichheit<br />
– Korrektheit <strong>und</strong> Äquivalenz von Programmen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 64 Einfache Typentheorie
Schwache Normalisierbarkeit<br />
• Tiefe d(T ) eines Typausdrucks T<br />
– d(T ) = 0, falls T ∈ T , d(S→T ) = 1 + max(d(S), d(T ))<br />
Tiefe von (λx.t) u: Tiefe des Typs von λx.t.<br />
Tiefe von t: maximale Tiefe der Redizes von t<br />
• Lemma: Reduziert man in t das am weitesten rechts<br />
stehende Redex maximaler Tiefe, so verringert sich die<br />
Anzahl der Redizes maximaler Tiefe.<br />
• Satz: Die Rightmost-Maxdepth-Strategie terminiert<br />
auf allen typisierbaren λ-Termen<br />
• Korollar: Jeder typisierbare λ-Term ist normalisierbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 65 Einfache Typentheorie
Starke Normalisierbarkeit – Begriffe<br />
• t stark normalisierbar:<br />
jede in t beginnende Reduktionsfolge terminiert.<br />
• Berechenbare typisierte Terme:<br />
– t ∈ T (T atomar) berechenbar, falls t stark normalisierbar<br />
– t ∈ S→T berechenbar, falls t s berechenbar für alle<br />
berechenbare s ∈ S<br />
• t neutral, falls t nicht die Gestalt λx.u hat.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 66 Einfache Typentheorie
Starke Normalisierbarkeit – Ergebnisse<br />
• T Typausdruck; t <strong>und</strong> t ′ Terme vom Typ T<br />
1. t berechenbar ⇒ t stark normalisierbar<br />
β<br />
2. t berechenbar, t −→ t ′ ⇒ t ′ berechenbar<br />
3. t neutral, jede β-Reduktion führt zu berechenbaren t ′<br />
⇒<br />
t berechenbar<br />
4. t neutral <strong>und</strong> in Normalform ⇒ t berechenbar.<br />
• t[s/x] berechenbar für alle berechenbaren s ⇒ λx.t berechenbar<br />
• x 1 . . . x n freie Variablen von t, b i berechenbare Terme vom Typ der x i .<br />
Dann ist t[b 1 . . . b n / x 1 . . . x n ] berechenbar<br />
• Alle typisierbaren λ-Terme sind berechenbar<br />
• Alle typisierbaren λ-Terme sind stark normalisierbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 67 Einfache Typentheorie
Konfluenz (<br />
r<br />
−→ Reduktionsrelation)<br />
• t<br />
t<br />
n<br />
−→ s: s ergibt sich aus t durch n Reduktionsschritte<br />
– t<br />
0<br />
−→ s, falls t=s<br />
– t n+1<br />
−→ s, falls es u gibt mit t<br />
∗<br />
−→ s: es gibt ein n ∈ N mit t<br />
t + −→ s: es gibt ein n>0 mit t<br />
• t↑s: es gibt u mit u<br />
• t↓s: es gibt u mit t<br />
r<br />
−→ u <strong>und</strong> u<br />
n −→ s<br />
n −→ s<br />
∗ −→ t <strong>und</strong> u<br />
∗<br />
−→ u <strong>und</strong> s<br />
n<br />
−→ s<br />
∗ −→ s<br />
∗ −→ u<br />
• r −→ konfluent: aus t↑s folgt immer t↓s<br />
• r −→ lokal konfluent: aus u<br />
r −→ t, u<br />
r −→ s folgt t↓s<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 68 Einfache Typentheorie
Konfluenz / Church-Rosser Theorem<br />
r<br />
• Lemma: −→ stark normalisierbar, lokal konfluent,<br />
dann<br />
r<br />
−→ konfluent<br />
• Lemma: Die β-Reduktion<br />
• Satz: In der Typentheorie ist<br />
• Korollar:<br />
β −→ ist lokal konfluent<br />
β<br />
−→ konfluent<br />
Typisierbare λ-Terme haben eindeutige Normalformen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 69 Einfache Typentheorie
Integration des Berechnungskalküls<br />
Konzept: Gleichheit von Termen innerhalb eines Typs<br />
s=t + t ∈ T ↦→ s = t ∈ T<br />
Modifizierte Regeln<br />
Γ ⊢ f t = g u ∈ T by applyEq S<br />
Γ ⊢ f = g ∈ S→T<br />
Γ ⊢ t = u ∈ S<br />
Γ ⊢ λx.t = λy.u ∈ S→T by lambdaEq<br />
Γ, x ′ :S ⊢ t[x ′ /x] = u[x ′ /y] ∈ T<br />
Γ ⊢ S ∈ U<br />
Γ ⊢ (λx.u) s = t ∈ T<br />
u[s/x] = t ∈ T<br />
by reduction<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 70 Einfache Typentheorie
Curry-Howard Isomorphie<br />
Integration der <strong>Logik</strong><br />
Γ ⊢ λx.t ∈ S→T by lambda i<br />
Γ, x ′ :S ⊢ t[x ′ /x] ∈ T<br />
Γ ⊢ S ∈ U<br />
Γ ⊢ A ⇒ B by imp i<br />
Γ,A ⊢ B<br />
Γ ⊢ f t ∈ T by apply i S<br />
Γ ⊢ f ∈ S→T<br />
Γ ⊢ t ∈ S<br />
Γ ⊢ B by modus ponens A<br />
Γ ⊢ A ⇒ B<br />
Γ ⊢ A<br />
Typ<br />
Formel<br />
Variable vom Typ S<br />
Annahme der Formel S<br />
Term vom Typ T (freie Variablen aus S i ) Beweis von T (Annahmen S i )<br />
Typechecking<br />
Beweisführung<br />
(Regel der) λ-Abstraktion<br />
⇒ -Einführung<br />
(Regel der) Applikation<br />
⇒ -Elimination<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 71 Einfache Typentheorie
Schließen über <strong>Programmierung</strong><br />
• Prädikatenlogik: Analyse der logischen Struktur<br />
– Bedeutung von Konzepten unwichtig<br />
• λ-Kalkül: Wert von Ausdrücken<br />
– sehr ausdrucksstark, kaum kontrollierbar<br />
• Einfache Typentheorie: Eigenschaften von Programmen<br />
– bisher zu ausdrucksschwach, da zu einfach<br />
⇒ Integriere <strong>Logik</strong> <strong>und</strong> λ-Kalkül <strong>und</strong> erweitere Typsystem<br />
↦→ Intuitionistische Typentheorie<br />
– komplexer, ausdrucksstärker, aufwendigere Semantik<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 72 Einfache Typentheorie
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 7<br />
Intuitionistische Typentheorie: Systematik, Syntax & Semantik<br />
1. Anforderungen an einen universell verwendbaren Kalkül<br />
– Konstruktive mathematische Gr<strong>und</strong>lagentheorie<br />
– Ausdruckskraft<br />
– Eigenschaften von Berechnungsmechanismen <strong>und</strong> Beweiskalkül<br />
2. Systematik der Syntax formaler Ausdrücke<br />
3. Semantik: Werte <strong>und</strong> Eigenschaften formaler Ausdrücke<br />
– Der Wert eines Ausdrucks<br />
– Urteile <strong>und</strong> hypothetische Urteile
Intuitionistische Typentheorie<br />
Universell verwendbarer Kalkül<br />
• Anforderungen <strong>und</strong> Gestaltungsziele<br />
• Systematik<br />
– Aufbau von Syntax, Semantik, Inferenzsystem<br />
– elementare Datentypen (Funktionenraum, Produktraum, disjunkte Vereinigung)<br />
• Einbettung von <strong>Logik</strong><br />
– Curry-Howard Isomorphie (intuitionistische <strong>Logik</strong>) / Leerer Datentyp<br />
– Gödelsche Übersetzung (klassische <strong>Logik</strong>)<br />
• <strong>Programmierung</strong> in der Typentheorie<br />
– Beweise als Programme<br />
– Zahlen, Listen, Teilmengen, Restklassen<br />
• Rekursion<br />
– induktive Typen, (partiell-)rekursive Funktionen, unendliche Objekte<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 74 Intuitionistische Typentheorie
Typentheorie – gr<strong>und</strong>legende Konstrukte<br />
• Funktionenraum S→T — λx.t, f t<br />
• Produktraum S×T — 〈s,t〉, let 〈x,y〉 = pair in u<br />
• Summe (disjunkte Vereinigung) S+T<br />
— inl(s), inr(t), case e of inl(x) ↦→ u | inr(y) ↦→ v<br />
• Natürliche Zahlen (N) oder ganze Zahlen (Z)<br />
— 0,1,-1,2,-2,..., +,-,*,/, Induktion<br />
• Listen (Folgen) S list — [], t.list, Induktion<br />
• Teilmengen {x:T |P (x)} — Restriktion der Elemente<br />
• Restklassen (Quotiententypen) — andere Gleichheit<br />
• Textketten (strings)<br />
• rekursive Datentypen, partiell-rekursive Funktionen<br />
• abhängige Datentypen x:S→T , x:S×T<br />
• <strong>Logik</strong> eingebettet durch Curry-Howard Isomorphie<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 75 Intuitionistische Typentheorie
Typentheorie – Anforderungen<br />
• Mathematische Gr<strong>und</strong>lagentheorie<br />
– konstruktive (formale) Mengentheorie<br />
– universelle Sprache zur Simulation aller Konzepte<br />
– Abstützung der Semantik “in sich selbst”, widerspruchsfrei<br />
• Terminierenden Berechnungen<br />
– Starke Normalisierbarkeit nicht erforderlich<br />
– feste Reduktionsstrategie<br />
• Konfluenz<br />
– Konsistenz zwischen Beweisführung <strong>und</strong> Berechnung<br />
• Typisierbarkeit?<br />
– problematisch wegen abhängiger Datentypen<br />
– Prüfung im Beweiskalkül<br />
• Beweis-/Programm-konstruktion (statt -überprüfung)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 76 Intuitionistische Typentheorie
Systematik des Theorieaufbaus<br />
Konstruktive semantische Theorie<br />
Syntax: Ausdrücke (Terme), bindende Vorkommen von Variablen<br />
Semantik:<br />
Werte von Termen<br />
– Unterteile in kanonische <strong>und</strong> nichtkanonische Terme<br />
– Wertbestimmung durch Reduktion auf kanonischen Term<br />
Urteile: Eigenschaften, Beziehungen zwischen Termen<br />
– Gleichheit, Typzugehörigkeit, Typ-Sein<br />
– Explizite (rekursive) Definition für kanonischen Terme, sonst zunächst Reduktion<br />
hypothetische Urteile: Argumentieren unter Annahmen<br />
Inferenzsystem:<br />
Repräsentation von (hypothetischen) Urteilen durch Sequenzen<br />
– Inferenzregeln spiegeln Semantikdefinition (unvollständig) wieder<br />
– Hinzunahme von Typuniversen <strong>und</strong> Gleichheitstyp in Syntax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 77 Typentheorie – Systematik
Ausdrücke – unsystematisch<br />
• x Ausdruck, falls x ∈ V<br />
• (t) Ausdruck, falls t Ausdruck<br />
• λx.t Ausdruck, falls x ∈ V <strong>und</strong> t Ausdruck<br />
• f t Ausdruck, falls t <strong>und</strong> f Ausdrücke<br />
• x:S→T <strong>und</strong> S→T Ausdrücke, falls x ∈ V, S <strong>und</strong> T Ausdrücke<br />
• 〈s,t〉 Ausdruck, falls s <strong>und</strong> t Ausdrücke<br />
• let 〈x,y〉 = e in u Ausdruck, falls x, y ∈ V sowie e <strong>und</strong> u Ausdrücke<br />
• x:S×T <strong>und</strong> S×T Ausdrücke, falls x ∈ V, S <strong>und</strong> T Ausdrücke<br />
• inl(s) <strong>und</strong> inr(t) Ausdrücke, falls s <strong>und</strong> t Ausdrücke<br />
• case e of inl(x) ↦→ u | inr(y) ↦→ v<br />
Ausdruck, falls x, y ∈ V <strong>und</strong> e, u, v Ausdrücke<br />
• S+T Ausdruck, falls S <strong>und</strong> T Ausdrücke<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 78 Typentheorie – Systematik
Freies/geb<strong>und</strong>enes Vorkommen von Variablen –<br />
unsystematisch<br />
• x: die Variable x kommt frei vor; y ≠ x kommt nicht vor.<br />
• (t): freie Vorkommen von x in t bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• λx.t: freie Vorkommen von x in t werden geb<strong>und</strong>en; freie Vorkommen von y ≠ x in t bleiben frei,<br />
geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• f t: freie Vorkommen von x in f <strong>und</strong> t bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• x:S→T : freie Vorkommen von x in T werden geb<strong>und</strong>en; freie Vorkommen von y ≠ x in T bleiben frei,<br />
geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
S→T : freie Vorkommen von x in S oder T bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• 〈s,t〉: freie Vorkommen von x in s <strong>und</strong> t bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• let 〈x,y〉 = e in u: freie Vorkommen von x <strong>und</strong> y in u werden geb<strong>und</strong>en; freie Vorkommen von x <strong>und</strong> y<br />
in e bleiben frei; freie Vorkommen von z ≠ x/y bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• x:S×T : freie Vorkommen von x in T werden geb<strong>und</strong>en; freie Vorkommen von y ≠ x in T bleiben frei,<br />
geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
S×T : freie Vorkommen von x in S oder T bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• inl(s), inr(t): freie Vorkommen von x in s bzw. t bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• case e of inl(x) ↦→ u | inr(y) ↦→ v : freie Vorkommen von x in u bzw. von y in v werden geb<strong>und</strong>en;<br />
freie Vorkommen von z ≠ x/y in u bzw. v bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• S+T : freie Vorkommen von x in S oder T bleiben frei, geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 79 Typentheorie – Systematik
Terme – einheitliche Definition<br />
Abstraktionsform opid{P 1 , . . . , P n }(b 1 ; . . . ; b n ) <strong>und</strong> Darstellungsform<br />
von Termen werden getrennt behandelt aber simultan betrachtet<br />
• I: Menge von Indexfamilien<br />
→ Indexfamilientabelle<br />
muß Famile variable enthalten<br />
p:F Parameter, falls F ∈ I <strong>und</strong> p zulässiges Element von F<br />
F Parametertyp, p Parameterwert<br />
• opid{P 1 , . . . , P n } Operator, falls opid Operatorname, P i Parameter<br />
→ Operatorentabelle<br />
muß Operator var enthalten<br />
• V: Menge von Variablen (Elemente von variable)<br />
– x 1 , . . . , x m .t geb<strong>und</strong>ener Term, falls t Term, x i ∈ V<br />
– op(b 1 ;. . .;b n ) Term, falls op Operator, b i geb<strong>und</strong>ene Terme<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 80 Typentheorie – Systematik
Indexfamilientabelle der Typentheorie von NuPRL<br />
variable : Variablennamen<br />
Zulässige Elemente: Zeichenketten aus [a−z A−Z 0−9 - %] +<br />
natural : Natürliche Zahlen<br />
Zulässige Elemente: Zeichenketten aus 0 + [1 − 9][0 − 9] ∗ .<br />
token : Zeichenketten (für Namen)<br />
Zulässige Elemente: alle Strings des NuPRL Zeichensatzes<br />
(keine Kontrollsymbole)<br />
string : Zeichenketten (für Texte)<br />
Zulässige Elemente: alle Strings des NuPRL Zeichensatzes<br />
(keine Kontrollsymbole)<br />
level-expression : Ausdrücke für Level von Typuniversen<br />
Zulässige Elemente: eingeschränkte arithmetische Ausdrücke<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 81 Typentheorie – Systematik
Operatorentabelle (Funktionen, Produkt, Summe)<br />
Operator <strong>und</strong> Termstruktur Display Form<br />
var{x:v}()<br />
x<br />
fun{}(S; x.T )<br />
x:S→T<br />
lam{}(x.t)<br />
λx.t<br />
apply{}(f;t)<br />
f t<br />
prod{}(S; x.T )<br />
x:S×T<br />
pair{}(s;t)<br />
〈s,t〉<br />
spread{}(e; x,y.u) let 〈x,y〉 = e in u<br />
union{}(S;T )<br />
S+T<br />
inl{}(s), inr{}(t) inl(s), inr(t)<br />
decide{}(e; x.u; y.v) case e of inl(x) ↦→ u | inr(y) ↦→ v<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 82 Typentheorie – Systematik
Freies <strong>und</strong> geb<strong>und</strong>enes Vorkommen von Variablen<br />
• var{x:v}: x ∈ V kommt frei vor; y ≠ x kommt nicht vor.<br />
• op(b 1 ;. . .;b n ): freie Vorkommen von x in den b i bleiben frei,<br />
geb<strong>und</strong>ene Vorkommen bleiben geb<strong>und</strong>en.<br />
• x 1 , . . . , x m .t: freie <strong>und</strong> geb<strong>und</strong>ene Vorkommen der x i in t werden<br />
geb<strong>und</strong>en; freie Vorkommen von y ≠ x i bleiben frei, geb<strong>und</strong>ene<br />
Vorkommen von y bleiben geb<strong>und</strong>en.<br />
t[x 1 , . . . , x n ]: x 1 , . . . , x n kommen frei in t vor<br />
t geschlossen, falls t keine freien Variablen enthält<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 83 Typentheorie – Systematik
Substitution in Termen<br />
var{x:v}()[t/x]<br />
= t<br />
var{x:v}()[t/y] = var{x:v}(), (y ≠ x)<br />
(op(b 1 ;. . .;b n ))[t/x]<br />
= op(b 1 [t/x];. . .;b n [t/x])<br />
(x 1 ,...,x n .u)[t/x] = x 1 ,...,x n .u,<br />
x ist eines der x i<br />
(x 1 ,...,x n .u)[t/x] = x 1 ,...,x n .u[t/x]<br />
x verschieden von allen x i , x nicht frei in u oder<br />
keines der x i frei in t<br />
(x 1 ,..,x j ,..,x n .u)[t/x] = (x 1 ,..,z,..,x n .u[z/x j ])[t/x]<br />
x verschieden von allen x i , x frei in u, x j frei<br />
in t, z neue Variable.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 84 Typentheorie – Systematik
Auswertung von Ausdrücken<br />
Die Semantik der Typentheorie basiert auf Lazy Evaluation<br />
• t = opid{P 1 , . . . , P n }(b 1 , . . . , b n ) kanonisch,<br />
falls opid in Operatorentabelle als kanonisch gekennzeichnet.<br />
Wert: geschlossener kanonischer Term<br />
• prinzipiellen Argumente von t (Hauptargumente von t):<br />
in Operatorentabelle gekennzeichnete Teilterme von t<br />
• t Redex: t nichtkanonisch, prinzipielle Argumente in<br />
kanonischer Form + Eintrag in<br />
→ Redex–Kontrakta Tabelle<br />
Kontraktum von t: zugehöriger Eintrag in Redex–Kontrakta Tabelle<br />
• t reduzierbar auf u (t<br />
• u Wert eines geschlossenen Terms t (t<br />
β<br />
−→ u), falls u Kontraktum von t<br />
l<br />
−→ u):<br />
u Ergebnis der Anwendung der Auswertungsprozedur EVAL auf t.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 85 Typentheorie – Systematik
Algorithmus EVAL(t)<br />
• Falls t in kanonischer Form: Ausgabe t<br />
• Falls t nichtkanonisch:<br />
Bestimme s 1 :=EVAL(t 1 ), . . . , s n :=EVAL(t n ), wobei die<br />
t i die Hauptargumente von t sind.<br />
Ersetze in t die t i durch ihre Werte s i ;<br />
nenne das Result s<br />
– Falls s ein Redex ist <strong>und</strong> u das zugehörige<br />
Kontraktum, so gebe EVAL(u) als Wert aus.<br />
– Andernfalls stoppe die Reduktion ohne Ergebnis:<br />
t besitzt keinen Wert.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 86 Typentheorie – Systematik
Vollständige Operatorentabelle (Funktionen,<br />
Produkt, Summe)<br />
kanonisch<br />
nichtkanonisch<br />
(Typen)<br />
(Elemente)<br />
var{x:v}()<br />
x<br />
fun{}(S; x.T ) lam{}(x.t) apply{}( f ;t)<br />
x:S→T λx.t f t<br />
prod{}(S; x.T ) pair{}(s;t) spread{}( e ; x,y.u)<br />
x:S×T 〈s,t〉 let 〈x,y〉 = e in u<br />
union{}(S;T ) inl{}(s), inr{}(t) decide{}( e ; x.u; y.v)<br />
S+T inl(s), inr(t) case e of inl(x) ↦→ u | inr(y) ↦→ v<br />
Hauptargumente umrandet, Trennung von Typen <strong>und</strong> Elementen nur informativ<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 87 Typentheorie – Systematik
Redex–Kontrakta Tabelle (Funktionen, Produkt,<br />
Summe)<br />
Redex<br />
(λx.u) t<br />
let 〈x,y〉 = 〈s,t〉 in u<br />
case inl(s) of inl(x) ↦→ u | inr(y) ↦→ v<br />
case inr(t) of inl(x) ↦→ u | inr(y) ↦→ v<br />
β<br />
−→<br />
β<br />
Kontraktum<br />
u[t/x]<br />
−→ u[s, t / x, y]<br />
β<br />
−→<br />
β<br />
−→<br />
u[s/x]<br />
v[t/y]<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 88 Typentheorie – Systematik
Urteile in der Typentheorie<br />
Semantische Gr<strong>und</strong>bausteine zur<br />
Formulierung der Eigenschaften von Termen<br />
• T Typ: T ist ein Ausdruck für einen Typ (Menge).<br />
(Typ-Sein)<br />
• S=T : S <strong>und</strong> T beschreiben denselben Typ.<br />
(Typgleichheit)<br />
• t ∈ T : t beschreibt ein Element des Typs T<br />
(Typzugehörigkeit)<br />
• s=t ∈ T : s <strong>und</strong> t beschreiben dasselbe Element des<br />
Typs T<br />
(Elementgleichheit)<br />
Semantische Gleichheit ist stärker als Identität von Werten<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 89 Typentheorie – Systematik
Semantik von Urteilen<br />
• T Typ, falls T =T<br />
• S=T , falls es kanonische Terme S ′ <strong>und</strong> T ′ gibt mit<br />
l<br />
S −→ S ′ l<br />
, T −→ T ′ <strong>und</strong> S ′ =T ′ folgt aus<br />
→ Typsemantiktabelle<br />
• t ∈ T , falls t=t ∈ T<br />
• s=t ∈ T , falls es kanonische Terme s ′ , t ′ <strong>und</strong> T ′ gibt<br />
l<br />
mit s −→ s ′ l<br />
, t −→ t ′ , T =T ′ <strong>und</strong> s ′ =t ′ ∈ T ′ folgt aus<br />
→ Elementsemantiktabelle<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 90 Typentheorie – Systematik
Semantiktabellen für Funktionen, Produkt, Summe<br />
Typsemantik<br />
x 1 :S 1 →T 1 = x 2 :S 2 →T 2 ≡ S 1 =S 2 <strong>und</strong> T 1 [s 1 /x 1 ]=T 2 [s 2 /x 2 ] für alle Terme s 1 , s 2 mit<br />
s 1 =s 2 ∈ S 1 .<br />
T = S 2 →T 2 ≡ T = x 2 :S 2 →T 2 für ein beliebiges x 2 ∈ V.<br />
S 1 →T 1 = T ≡ x 1 :S 1 →T 1 = T für ein beliebiges x 1 ∈ V.<br />
x 1 :S 1 ×T 1 = x 2 :S 2 ×T 2 ≡ S 1 =S 2 <strong>und</strong> T 1 [s 1 /x 1 ]=T 2 [s 2 /x 2 ] für alle Terme s 1 , s 2 mit<br />
s 1 =s 2 ∈ S 1 .<br />
T = S 2 ×T 2 ≡ T = x 2 :S 2 ×T 2 für ein beliebiges x 2 ∈ V.<br />
S 1 ×T 1 = T ≡ x 1 :S 1 ×T 1 = T für ein beliebiges x 1 ∈ V.<br />
S 1 +T 1 = S 2 +T 2 ≡ S 1 =S 2 <strong>und</strong> T 1 =T 2 .<br />
Elementsemantik<br />
λx 1 .t 1 = λx 2 .t 2 ∈ x:S→T ≡ x:S→T Typ <strong>und</strong> t 1 [s 1 /x 1 ] = t 2 [s 2 /x 2 ] ∈ T [s 1 /x] für<br />
alle Terme s 1 , s 2 mit s 1 =s 2 ∈ S.<br />
〈s 1 ,t 1 〉 = 〈s 2 ,t 2 〉 ∈ x:S×T ≡ x:S×T Typ <strong>und</strong> s 1 =s 2 ∈ S <strong>und</strong> t 1 =t 2 ∈ T [s 1 /x].<br />
inl(s 1 ) = inl(s 2 ) ∈ S+T ≡ S+T Typ <strong>und</strong> s 1 =s 2 ∈ S.<br />
inr(t 1 ) = inr(t 2 ) ∈ S+T ≡ S+T Typ <strong>und</strong> t 1 =t 2 ∈ T .<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 91 Typentheorie – Systematik
Eigenschaften der semantischen Urteile<br />
• Typgleichheit S=T ist transitiv <strong>und</strong> symmetrisch (aber nicht reflexiv)<br />
• S=T gilt genau dann, wenn es S ′ gibt mit S<br />
l<br />
−→ S ′ <strong>und</strong> S ′ =T .<br />
• Elementgleichheit s=t ∈ T ist transitiv <strong>und</strong> symmetrisch (aber nicht<br />
reflexiv) in s <strong>und</strong> t.<br />
• s=t ∈ T gilt genau dann, wenn es s ′ gibt mit s<br />
• Aus s=t ∈ T folgt, daß T ein Typ (T =T ) ist.<br />
• Aus s=t ∈ T <strong>und</strong> S=T folgt, daß s=t ∈ S gilt.<br />
l<br />
−→ s ′ <strong>und</strong> s ′ =t ∈ T .<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 92 Typentheorie – Systematik
Hypothetische Urteile<br />
Urteile unter gegebenen Hypothesen<br />
x 1 :T 1 ,. . . ,x n :T n ⊢ J<br />
Unter der Annahme, daß x i Variablen vom Typ T i sind, gilt das Urteil J<br />
• Semantisches Gegenstück zur Sequenz<br />
• Funktionalität: J[t i /x i ] gilt für alle kanonischen Elemente<br />
t i ∈ T i<br />
• Extensionalität: falls t i =t ′ i ∈ T i , dann gilt J[t i /x i ] genau<br />
dann, wenn J[t ′ i /x i] gilt (t i <strong>und</strong> t ′ i<br />
auch nichtkanonisch)<br />
• Formale Definition aufwendig<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 93 Typentheorie – Systematik
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 8<br />
Intuitionistische Typentheorie: Inferenzsystem<br />
1. Universen:<br />
– syntaktische Repräsentation der Typ-Eigenschaft<br />
2. Gleichheit als Proposition<br />
3. Entwicklung von Beweisen statt Überprüfung<br />
4. Sequenzen, Regeln <strong>und</strong> formale Beweise<br />
5. Das Regelsystem im Detail<br />
6. Gr<strong>und</strong>prinzipien des systematischen Aufbaus
Syntaktische Repräsentation von Urteilen<br />
• Sequenzen x 1 :T 1 ,...,x n :T n ⊢ C als Gr<strong>und</strong>struktur<br />
• Universen: Repräsentation der Typ-Eigenschaft<br />
– ‘T Typ’ → ‘T ∈ U’, ‘S=T ’ → ‘S=T ∈ U<br />
– Universen müssen selbst (Typ-)ausdrücke sein<br />
– Jede Theorie mit x:S→T <strong>und</strong> U ∈ U ist inkonsistent.<br />
⇒ kumulative Hierarchie von Universen U=U 1<br />
∈<br />
⊂ U 2<br />
∈<br />
⊂ U 3<br />
∈<br />
⊂ . . .<br />
• Gleichheit als Typ<br />
– ermöglicht Schließen über Gleichheiten in Hypothesen<br />
– Propositionen als Datentypen – Elemente entsprechen Beweisen<br />
(syntaktische Darstellung – nicht konzeptuelle Gleichsetzung)<br />
• Implizite Darstellung von Elementen in Urteilen: T ⌊p⌋<br />
– p Extrakt-Term von T<br />
– ermöglicht Konstruktion von Beweisen <strong>und</strong> Programmen<br />
– Überprüfung von Urteilen durch Verwendung des Gleichheitstyps<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 95 Intuitionistische Typentheorie – Inferenzsystem
Universen <strong>und</strong> Gleichheit – Syntax<br />
kanonisch<br />
nichtkanonisch<br />
(Typen)<br />
U{j:l}()<br />
(Elemente)<br />
(alle kanonischen Typen)<br />
U j<br />
equal{}(s;t;T ) Axiom{}()<br />
s = t ∈ T<br />
Axiom<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 96 Intuitionistische Typentheorie – Inferenzsystem
Universen <strong>und</strong> Gleichheit – Semantik<br />
Typsemantik<br />
s 1 = t 1 ∈ T 1 = s 2 = t 2 ∈ T 2 ≡ T 1 =T 2 <strong>und</strong> s 1 =s 2 ∈ T 1 <strong>und</strong> t 1 =t 2 ∈ T 1<br />
U j1<br />
= U j2<br />
≡ j 1 =j 2 (als natürliche Zahl)<br />
Elementsemantik<br />
Axiom = Axiom ∈ s = t ∈ T ≡ s=t ∈ T<br />
x 1 :S 1 →T 1 = x 2 :S 2 →T 2 ∈ U j ≡ S 1 =S 2 ∈ U j <strong>und</strong> T 1 [s 1 /x 1 ]=T 2 [s 2 /x 2 ] ∈ U j für alle<br />
Terme s 1 , s 2 mit s 1 =s 2 ∈ S 1<br />
T = S 2 →T 2 ∈ U j ≡ T = x 2 :S 2 →T 2 ∈ U j für ein beliebiges x 2 ∈ V<br />
S 1 →T 1 = T ∈ U j ≡ x 1 :S 1 →T 1 = T ∈ U j für ein beliebiges x 1 ∈ V<br />
x 1 :S 1 ×T 1 = x 2 :S 2 ×T 2 ∈ U j ≡ S 1 =S 2 ∈ U j <strong>und</strong> T 1 [s 1 /x 1 ]=T 2 [s 2 /x 2 ] ∈ U j für alle<br />
Terme s 1 , s 2 mit s 1 =s 2 ∈ S 1<br />
T = S 2 ×T 2 ∈ U j ≡ T = x 2 :S 2 ×T 2 ∈ U j für ein beliebiges x 2 ∈ V<br />
S 1 ×T 1 = T ∈ U j ≡ x 1 :S 1 ×T 1 = T ∈ U j für ein beliebiges x 1 ∈ V<br />
S 1 +T 1 = S 2 +T 2 ∈ U j ≡ S 1 =S 2 ∈ U j <strong>und</strong> T 1 =T 2 ∈ U j<br />
s 1 = t 1 ∈ T 1 = s 2 = t 2 ∈ T 2 ∈ U j ≡ T 1 =T 2 ∈ U j <strong>und</strong> s 1 =s 2 ∈ T 1 <strong>und</strong> t 1 =t 2 ∈ T 1<br />
U j1<br />
= U j2<br />
∈ U j ≡ j 1 =j 2
Formales Schließen in der Typentheorie<br />
• Explizit – Überprüfung eines Urteils:<br />
– Typ-Sein “T Typ”: beweise ⊢ T = T ∈ U j<br />
(Zeige Existenz eines Terms p <strong>und</strong> eines Levels j mit p ∈ T = T ∈ U j )<br />
– Typgleichheit “S=T ”: beweise ⊢ S = T ∈ U j<br />
– Typzugehörigkeit “t ∈ T ”: beweise ⊢ t = t ∈ T<br />
– Elementgleichheit “s=t ∈ T ”: beweise ⊢ s = t ∈ T<br />
• Implizit – Konstruktion von Termen, die Urteil erfüllen:<br />
– Konstruktion von Datentypen: beweise ⊢ U j<br />
– Konstruktion von Elementen eines Typs: beweise ⊢ T<br />
(Zeige Existenz eines Terms t mit t ∈ T )<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 98 Intuitionistische Typentheorie – Inferenzsystem
Sequenzen x 1 :T 1 ,. . . ,x n :T n ⊢ C<br />
• Deklaration x:T — x Variable, T Term<br />
• Hypothesenliste Γ = x 1 :T 1 ,..., x n :T n — x i :T i Deklarationen.<br />
• Konklusion C — C Term<br />
• Sequenz (Beweisziel)<br />
Γ ⊢ C — Γ Hypothesenliste, C Konklusion<br />
• x 1 :T 1 ,...,x n :T n ⊢ C geschlossen, falls jede in C oder T i frei<br />
vorkommende Variable x zuvor durch x:T j deklariert wurde<br />
• Z = Γ ⊢ C rein, wenn Z geschlossen, jede Variable nur einmal<br />
deklariert<br />
• Γ ⊢ C gültig, falls es einen Term t gibt, für den Γ ⊢ t ∈ C ein<br />
hypothetisches Urteil ist.<br />
Notation: Γ ⊢ C ⌊t⌋, falls t bekannt<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 99 Intuitionistische Typentheorie – Inferenzsystem
Regeln<br />
Dekomposition von Zielen<br />
+<br />
Aufbau von Evidenzen (Validierung)<br />
• Dekomposition: Beweisziel<br />
↦→ endliche Liste von Sequenzen (Teilziele)<br />
• Validierung: Liste von Sequenzen <strong>und</strong> Termen<br />
↦→ Term<br />
• Inferenzregel (dec,val) — dec Dekomposition, val Validierung<br />
• r = (dec,val) korrekt, falls für jede reine Sequenz Z = Γ ⊢ C<br />
– Alle Teilziele Z 1 = Γ 1 ⊢ C 1 , . . . , Z n = Γ n ⊢ C n sind rein<br />
– Aus der Gültigkeit aller Z i folgt die Gültigkeit von Z<br />
– Gilt Γ i ⊢ C ⌊t i ⌋ für alle Z i , so folgt Γ ⊢ C ⌊t⌋,<br />
wobei t = val([(Z 1 ,t 1 ),. . . ,(Z n t n )])<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 100 Intuitionistische Typentheorie – Inferenzsystem
Beweise <strong>und</strong> Extrakt-Terme<br />
• Jede Sequenz Z ist ein unvollständiger Beweis mit Wurzel Z<br />
(Z, r, [π 1 ,. . . ,π n ]) Beweis mit Wurzel Z, falls<br />
– Z = Γ ⊢ C Sequenz,<br />
– r = (dec,val) korrekte Inferenzregel,<br />
– π 1 ,. . . ,π n Beweise, deren Wurzeln die Teilziele von Z sind<br />
• π vollständig, wenn π keine unvollständigen Teilbeweise enthält<br />
• Extrakt-Term EXT(π):<br />
– EXT(Z, (dec,val), [π 1 ,...,π n ])<br />
= val([ (Z 1 ,EXT(π 1 )),. . . , (Z n ,EXT(π n )) ]) (Z i Wurzel von π i )<br />
• Initialsequenz: geschlossene Sequenz ⊢ C<br />
• Theorem: vollständiger Beweis mit Initialsequenz als Wurzel<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 101 Intuitionistische Typentheorie – Inferenzsystem
Regelarten<br />
• Formationsregeln:<br />
– wie ist ein Typ zusammengesetzt? (typEq) Γ ⊢ S = T ∈ U j<br />
• Kanonische Regeln:<br />
– wann sind kanonische Elemente gleich? (elementEq) Γ ⊢ s = t ∈ T<br />
– wie sind Elemente zusammengesetzt? (elementI) Γ ⊢ T ⌊t⌋<br />
• Nichtkanonische Regeln:<br />
– wann gehört ein Ausdruck zu einem Typ? (nichtkanonischEq) Γ ⊢ s = t ∈ T<br />
– wie kann eine Variable benutzt werden? (typE) Γ, x:S, ∆ ⊢ T ⌊t⌋<br />
• Berechnungsregeln:<br />
– Reduktion von Redizes in Gleichheit (nichtkanonischRed) Γ ⊢ redex = t ∈ T<br />
+ spezielle Regeln<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 102 Intuitionistische Typentheorie – Inferenzsystem
Parameter zur Steuerung von Regeln<br />
• Position i einer zu elimierenden Variablen<br />
functionE i s<br />
• Term s als einzusetzender Wert<br />
functionE i s<br />
• Level j des Universums, das innerhalb eines Unterziels<br />
benötigt wird<br />
lambdaEq j<br />
• Typ T eines Teilterms des Beweiszieles, welcher in<br />
einem Unterziel isoliert auftritt. applyEq x:S→T<br />
• Abhängigkeit eines (instantiierten) Terms C von einer<br />
Variablen z<br />
spreadEq z C x:S×T<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 103 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Regeln für Funktionenraum<br />
Γ ⊢ x 1 :S 1 →T 1 = x 2 :S 2 →T 2 ∈ U j<br />
Ax<br />
by functionEq<br />
Γ ⊢ S 1 = S 2 ∈ U j<br />
Ax<br />
Γ, x:S 1 ⊢ T 1 [x/x 1 ] = T 2 [x/x 2 ] ∈ U j<br />
Ax<br />
Γ ⊢ λx 1 .t 1 = λx 2 .t 2 ∈ x:S→T Ax<br />
by lambdaEq j<br />
Γ, x ′ :S ⊢ t 1 [x ′ /x 1 ] = t 2 [x ′ /x 2 ] ∈ T [x ′ /x]<br />
Γ ⊢ S ∈ U j<br />
Ax<br />
Γ ⊢ f 1 t 1 = f 2 t 2 ∈ T [t 1 /x]<br />
by applyEq x:S→T<br />
Γ ⊢ f 1 = f 2 ∈ x:S→T<br />
Γ ⊢ t 1 = t 2 ∈ S Ax<br />
Ax<br />
Ax<br />
Ax<br />
Γ ⊢ x:S→T ⌊λx ′ .t⌋<br />
by lambdaI j<br />
Γ, x ′ :S ⊢ T [x ′ /x] ⌊t⌋<br />
Γ ⊢ S ∈ U j<br />
Ax<br />
Γ, f: x:S→T , ∆ ⊢ C ⌊t[f s, Axiom/y, z]⌋<br />
by functionE i s<br />
Γ, f: x:S→T , ∆ ⊢ s ∈ S Ax<br />
Γ, f: x:S→T , y:T [s/x],<br />
z: y = f s ∈ T [s/x], ∆ ⊢ C ⌊t⌋<br />
Γ ⊢ (λx.t) s = t 2<br />
by applyRed<br />
Γ ⊢ t[s/x] = t 2<br />
∈ T<br />
∈ T<br />
Ax<br />
Ax<br />
Γ ⊢ f 1 = f 2 ∈ x:S→T ⌊t⌋<br />
by functionExt j x 1 :S 1 →T 1 x 2 :S 2 →T 2<br />
Γ, x ′ :S ⊢ f 1 x ′ = f 2 x ′ ∈ T [x ′ /x] ⌊t⌋<br />
Γ ⊢ S ∈ U j<br />
Ax<br />
Γ ⊢ f 1 ∈ x 1 :S 1 →T 1 Ax<br />
Γ ⊢ f 2 ∈ x 2 :S 2 →T 2 Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 104 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Regeln für Produktraum<br />
Γ ⊢ x 1 :S 1 ×T 1 = x 2 :S 2 ×T 2 ∈ U j<br />
Ax<br />
by productEq<br />
Γ ⊢ S 1 = S 2 ∈ U j<br />
Ax<br />
Γ, x ′ :S 1 ⊢ T 1 [x ′ /x 1 ] = T 2 [x ′ /x 2 ] ∈ U j<br />
Ax<br />
Γ ⊢ 〈s 1 ,t 1 〉 = 〈s 2 ,t 2 〉 ∈ x:S×T<br />
by pairEq j<br />
Γ ⊢ s 1 = s 2 ∈ S Ax<br />
Γ ⊢ t 1 = t 2 ∈ T [s 1 /x] Ax<br />
Γ, x ′ :S ⊢ T [x ′ /x] ∈ U j<br />
Ax<br />
Ax<br />
Γ ⊢ x:S×T ⌊〈s,t〉⌋<br />
by pairI j s<br />
Γ ⊢ s ∈ S Ax<br />
Γ ⊢ T [s/x] ⌊t⌋<br />
Γ, x ′ :S ⊢ T [x ′ /x] ∈ U j<br />
Ax<br />
Γ ⊢ let 〈x 1 ,y 1 〉 = e 1 in t 1<br />
= let 〈x 2 ,y 2 〉 = e 2 in t 2 ∈ C[e 1 /z] Ax<br />
by spreadEq z C x:S×T<br />
Γ ⊢ e 1 = e 2 ∈ x:S×T Ax<br />
Γ, s:S, t:T [s/x], y: e 1 =〈s,t〉 ∈ x:S×T<br />
⊢ t 1 [s, t/x 1 , y 1 ] = t 2 [s, t/x 2 , y 2 ] ∈ C[〈s,t〉/z]<br />
Ax<br />
Γ, z: x:S×T , ∆ ⊢ C ⌊let 〈s,t〉 = z in u⌋<br />
by productE i<br />
Γ, z: x:S×T , s:S, t:T [s/x] ∆[〈s,t〉/z]<br />
⊢ C[〈s,t〉/z] ⌊u⌋<br />
Γ ⊢ let 〈x,y〉 = 〈s,t〉 in u = t 2<br />
by spreadRed<br />
Γ ⊢ u[s, t/x, y] = t 2 ∈ T<br />
Ax<br />
∈ T<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 105 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Regeln für disjunkte Vereinigung<br />
Γ ⊢ S 1 +T 1 = S 2 +T 2 ∈ U j<br />
Ax<br />
by unionEq<br />
Γ ⊢ S 1 = S 2 ∈ U j<br />
Ax<br />
Γ ⊢ T 1 = T 2 ∈ U j<br />
Ax<br />
Γ ⊢ inl(s 1 ) = inl(s 2 ) ∈ S+T<br />
by inlEq j<br />
Γ ⊢ s 1 = s 2 ∈ S Ax<br />
Γ ⊢ T ∈ U j<br />
Ax<br />
Γ ⊢ inr(t 1 ) = inr(t 2 ) ∈ S+T<br />
by inrEq j<br />
Γ ⊢ t 1 = t 2 ∈ T Ax<br />
Γ ⊢ S ∈ U j<br />
Ax<br />
Ax<br />
Ax<br />
Γ ⊢ S+T ⌊inl(s)⌋<br />
by inlI j<br />
Γ ⊢ S ⌊s⌋<br />
Γ ⊢ T ∈ U j<br />
Ax<br />
Γ ⊢ S+T ⌊inr(t)⌋<br />
by inrI j<br />
Γ ⊢ T ⌊t⌋<br />
Γ ⊢ S ∈ U j<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 106 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Γ ⊢ case e 1 of inl(x 1 ) ↦→ u 1 | inr(y 1 ) ↦→ v 1<br />
= case e 2 of inl(x 2 ) ↦→ u 2 | inr(y 2 ) ↦→ v 2<br />
∈ C[e 1 /z] Ax<br />
by decideEq z C S+T<br />
Γ ⊢ e 1 = e 2 ∈ S+T Ax<br />
Γ, s:S, y: e 1 =inl(s) ∈ S+T<br />
⊢ u 1 [s/x 1 ] = u 2 [s/x 2 ] ∈ C[inl(s)/z] Ax<br />
Γ, t:T , y: e 1 =inr(t) ∈ S+T<br />
⊢ v 1 [t/y 1 ] = v 2 [t/y 2 ] ∈ C[inr(t)/z] Ax<br />
Γ, z:S+T , ∆ ⊢ C<br />
⌊case z of inl(x) ↦→ u | inr(y) ↦→ v ⌋<br />
by unionE i<br />
Γ, z:S+T , x:S, ∆[inl(x)/z]<br />
⊢ C[inl(x)/z] ⌊u⌋<br />
Γ, z:S+T , y:T , ∆[inr(y)/z]<br />
⊢ C[inr(y)/z] ⌊v⌋<br />
Γ ⊢ case inl(s) of inl(x) ↦→ u | inr(y) ↦→ v<br />
= t 2 ∈ T Ax<br />
by decideRedL<br />
Γ ⊢ u[s/x] = t 2 ∈ T Ax<br />
Γ ⊢ case inr(t) of inl(x) ↦→ u | inr(y) ↦→ v<br />
= t 2 ∈ T Ax<br />
by decideRedR<br />
Γ ⊢ v[t/y] = t 2 ∈ T Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 107 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Regeln für Universen <strong>und</strong> Gleichheit<br />
Γ ⊢ U j<br />
∈ U k<br />
Ax<br />
by univEq ∗<br />
∗ : nur , wenn j < k<br />
Γ ⊢ s 1 = t 1 ∈ T 1 = s 2 = t 2 ∈ T 2 ∈ U j<br />
Ax<br />
by equalityEq<br />
Γ ⊢ T 1 = T 2 ∈ U j<br />
Ax<br />
Γ ⊢ s 1 = s 2 ∈ T 1 Ax<br />
Γ ⊢ t 1 = t 2 ∈ T 1 Ax<br />
Γ ⊢ T ∈ U k<br />
Ax<br />
by cumulativity j ∗<br />
Γ ⊢ T ∈ U j<br />
Ax<br />
Γ ⊢ Axiom ∈ s = t ∈ T<br />
by axiomEq<br />
Γ ⊢ s = t ∈ T Ax<br />
Ax<br />
Γ, z: s = t ∈ T , ∆ ⊢ C ⌊u⌋<br />
by equalityElim i<br />
Γ, z: s = t ∈ T , ∆[Axiom/z]<br />
⊢ C[Axiom/z] ⌊u⌋<br />
Γ, x:T , ∆ ⊢ x ∈ T<br />
by hypEq i<br />
Ax<br />
Γ ⊢ s = t ∈ T<br />
by symmetry<br />
Γ ⊢ t = s ∈ T<br />
Ax<br />
Ax<br />
Γ ⊢ s = t ∈ T Ax<br />
by transitivity t ′<br />
Γ ⊢ s = t ′ ∈ T Ax<br />
Γ ⊢ t ′ = t ∈ T Ax<br />
Γ ⊢ C[s/x] ⌊u⌋<br />
by subst j s = t ∈ T x C<br />
Γ ⊢ s = t ∈ T Ax<br />
Γ ⊢ C[t/x] ⌊u⌋<br />
Γ, x:T ⊢ C ∈ U j<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 108 Intuitionistische Typentheorie – Inferenzsystem
¡<br />
Strukturelle Regeln<br />
Γ, x:T , ∆ ⊢ T ⌊x⌋<br />
by hypothesis i<br />
Γ,∆ ⊢ C ⌊(λx.t) s⌋<br />
by cut i T<br />
Γ,∆ ⊢ T ⌊s⌋<br />
Γ,x:T ,∆ ⊢ C ⌊t⌋<br />
Γ ⊢ T ⌊t⌋<br />
by intro t<br />
Γ ⊢ t ∈ T Ax<br />
Γ, x:T , ∆ ⊢ C ⌊t⌋<br />
by thin i<br />
Γ,∆ ⊢ C ⌊t⌋<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 109 Intuitionistische Typentheorie – Inferenzsystem
Hinzunahme neuer Typkonstrukte<br />
• Syntax <strong>und</strong> Darstellungsform in Operatortabelle eintragen<br />
• Kanonische <strong>und</strong> nichtkanonische Terme trennen<br />
Redex-Kontrakta Tabelle erweitern<br />
• Semantik fixieren durch Einträge in Typbzw.<br />
Elementsemantiktabelle<br />
Auf Widersprüchlichkeiten achten !!<br />
• Inferenzregeln aufstellen<br />
Semantik wiederspiegeln<br />
Alternativ: konservative Erweiterung durch Definition<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 110 Intuitionistische Typentheorie – Inferenzsystem
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 9<br />
<strong>Logik</strong> in der Typentheorie<br />
1. Die Curry-Howard Isomorphie<br />
2. Der leere Datentyp void<br />
3. Konstruktive <strong>Logik</strong><br />
4. Klassische <strong>Logik</strong>
Curry-Howard Isomorphie<br />
Typ<br />
Formel<br />
Deklaration x:S<br />
Annahme der Formel S<br />
‘Urteil’ T [x i ]⌊t⌋ (Variablen x i ∈ S i ) Beweis t von T (Annahmen S i )<br />
Produkt A×B<br />
Konjunktion A ∧ B<br />
pairI indep<br />
∧ -Einführung<br />
productE<br />
∧ -Elimination<br />
Disjunkte Vereinigung A+B Disjunktion A ∨ B<br />
inlI, inrI<br />
∨ -Einführung<br />
unionE<br />
∨ -Elimination<br />
Funktioneraum A→B<br />
Implikation A ⇒ B<br />
lambdaI<br />
⇒ -Einführung<br />
functionE indep<br />
⇒ -Elimination<br />
Leerer Datentyp void<br />
Falschheit Λ<br />
Funktioneraum A→void Negation ¬A<br />
Funktionenraum x:T →A Universelle Quantifizierung ∀x:T .A<br />
lambdaI<br />
∀-Einführung<br />
functionE<br />
∀-Elimination<br />
Produkt x:T ×A Existentielle Quantifizierung ∃x:T .A<br />
pairI<br />
∃-Einführung<br />
productE<br />
∃-Elimination<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 112 <strong>Logik</strong> in der Typentheorie
Der leere Datentyp void<br />
• Gegenstück zur leeren Menge <strong>und</strong> zur logischen Falscheit<br />
• Simulierbar durch X:U 1 → X = X→X ∈ U 1<br />
– aber ohne nichtkanonische Elemente<br />
• Ergänzungen der Operatorentabelle<br />
kanonisch<br />
nichtkanonisch<br />
(Typen)<br />
(Elemente)<br />
void{}()<br />
void<br />
any{}(e)<br />
any(e)<br />
• Probleme<br />
(gelten schon für Gleichheitstyp)<br />
– unsinnige Hypothesen nach x:void möglich<br />
– Starke Normalisierbarkeit nur für extrahierte Terme<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 113 <strong>Logik</strong> in der Typentheorie
¡<br />
¡<br />
¡<br />
Semantik <strong>und</strong> Inferenzregeln für void<br />
Typsemantik<br />
void = void<br />
Elementsemantik<br />
s = t ∈ void gilt niemals !<br />
void = void ∈ U j falls j≤1 (als natürliche Zahl)<br />
Γ ⊢ void = void ∈<br />
by voidEq<br />
U j<br />
Ax<br />
Γ ⊢ any(s) = any(t) ∈<br />
by anyEq<br />
Γ ⊢ s = t ∈ void Ax<br />
T<br />
Ax<br />
Γ, z: void, ∆ ⊢ C ⌊any(z)⌋<br />
by voidE i<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 114 <strong>Logik</strong> in der Typentheorie
Konservative Erweiterung: (Konstruktive) <strong>Logik</strong><br />
A ∧ B ≡ and{}(A;B) ≡ A×B<br />
A ∨ B ≡ or{}(A;B) ≡ A+B<br />
A ⇒ B ≡ implies{}(A;B) ≡ A→B<br />
¬A ≡ not{}(A) ≡ A→void<br />
Λ ≡ false{}() ≡ void<br />
∀x:T .A ≡ all{}(T ; x.A) ≡ x:T →A<br />
∃x:T .A ≡ exists{}(T ; x.A) ≡ x:T ×A<br />
IP i ≡ prop{i:l}() ≡ U i<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 115 <strong>Logik</strong> in der Typentheorie
Konsequenzen der Curry-Howard Isomorphie<br />
• Das Prinzip “Propositionen als Datentypen” definiert<br />
die intuitionistische Prädikatenlogik (J ).<br />
• Schnitteliminationssatz: Ist Γ ⊢ C in LJ beweisbar,<br />
dann gibt es einen Beweis ohne Schnittregel.<br />
– Beweis durch Normalisierung der Extraktterme<br />
• Satz: LJ ist konsistent.<br />
– andernfalls gäbe es einen schnittfreien Beweis für ‘⊢ Λ’<br />
• Funktionenkalküle höherer Ordnung <strong>und</strong><br />
Prädikatenlogik beliebiger Stufe sind simulierbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 116 <strong>Logik</strong> in der Typentheorie
Konservative Erweiterung: Klassische <strong>Logik</strong><br />
Λ ≡ false{}() ≡ void<br />
¬A ≡ not{}(A) ≡ A→void<br />
A ∧ B ≡ and{}(A;B) ≡ A×B<br />
∀x:T .A ≡ all{}(T ; x.A) ≡ x:T →A<br />
A ∨ c B ≡ orc{}(A;B) ≡ ¬(¬A ∧ ¬B)<br />
A ⇒ c B ≡ impc{}(A;B) ≡ ¬A ∨ c B<br />
∃ c x:T .A ≡ exc{}(T ; x.A) ≡ ¬(∀x:T .¬A)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 117 <strong>Logik</strong> in der Typentheorie
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 10<br />
<strong>Programmierung</strong> in der Typentheorie<br />
1. Beweise als Programme<br />
2. Zahlen <strong>und</strong> Induktion<br />
– Die primitiv rekursive Arithmetik<br />
– Der NuPRL-Typ der ganzen Zahlen<br />
– Listen<br />
3. Teilmengen<br />
4. Quotienten (Restklassen)
Interpretationen der typentheoretischen Urteile<br />
T ∈ U j t ∈ T T ⌊t⌋<br />
T ist eine Menge t ist Element von T T ist nicht leer (inhabited)<br />
T ist Proposition t ist Beweis für T T ist wahr (beweisbar)<br />
T ist Intention t ist Methode, T zu erfüllen T ist erfüllbar (realisierbar)<br />
T ist Problem t ist Methode, T zu lösen T ist lösbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 119 <strong>Programmierung</strong> in der Typentheorie
Beweise als Programme<br />
• t ∈ T : ‘t ist Programm, das die Spezifikation T löst’<br />
‘⊢ T ⌊t⌋’: Aufgabe, ein Programm zu konstruieren<br />
• Konstruktives Auswahlaxiom:<br />
Für alle Universen U j kann man beweisen<br />
⊢ ∀T:U j .∀S:U j .∀spec: T×S→IP j .<br />
(∀x:T. ∃y:S. spec 〈x,y〉)<br />
⇒ ∃f:T→S.∀x:T. spec 〈x,f x〉<br />
⇒ Programmentwicklung ist dasselbe wie Beweisführung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 120 <strong>Programmierung</strong> in der Typentheorie
Primitiv rekursive Arithmetik<br />
• Natürliche Zahlen – minimale Ausgestaltung:<br />
– kanonisch: N 0, s:N→N<br />
– nichtkanonisch: ind(n; base; m,f m .t)<br />
• Reduktion<br />
ind(0; base; m,f m .t)<br />
ind(s(n); base; m,f m .t)<br />
β<br />
−→ base<br />
β<br />
−→ t[n, ind(n; base; m,f m .t) / m, f m ]<br />
⇒ Induktive Beweisführung ≡ Rekursives Programm<br />
• Regelsystem zu einfach für praktisches Arbeiten.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 121 <strong>Programmierung</strong> in der Typentheorie
¡<br />
¡<br />
¡<br />
¡<br />
Natürliche Zahlen – Regeln<br />
Γ ⊢ N ∈<br />
by natEq<br />
U j<br />
Ax<br />
Γ ⊢ 0 ∈ N<br />
by zeroEq<br />
Ax<br />
Γ ⊢ N ⌊0⌋<br />
by zeroI<br />
Γ ⊢ s(t 1 ) = s(t 2 ) ∈<br />
by sucEq<br />
Γ, ⊢ t 1 = t 2 ∈ N<br />
N<br />
Ax<br />
Ax<br />
Γ ⊢ N ⌊s(t)⌋<br />
by sucI<br />
Γ ⊢ N ⌊t⌋<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 122 <strong>Programmierung</strong> in der Typentheorie
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Natürliche Zahlen – Regeln II<br />
Γ ⊢ ind(n 1 ; b 1<br />
; m 1 ,f m1 .t 1 )<br />
= ind(n 2 ; b 2<br />
; m 2 ,f m2 .t 2 )<br />
∈ T [n 1 /z] Ax<br />
by indEq z T<br />
Γ ⊢ n 1 = n 2 ∈ N Ax<br />
Γ ⊢ b 1<br />
= b 2<br />
∈ T [0/z] Ax<br />
Γ, m:N, f m :T [m/z]<br />
⊢ t 1 [m, f m / m 1 , f m1 ]<br />
= t 2 [m, f m / m 2 , f m2 ]<br />
∈ T [s(m)/z] Ax<br />
Γ, n:N, ∆ ⊢ C<br />
⌊ind(n; b; m,f m .t)⌋<br />
by natE i<br />
Γ, n:N, ∆ ⊢ C[0/n] ⌊b⌋<br />
Γ, n:N, ∆, m:N, f m :C[m/n]<br />
⊢ C[s(m)/n] ⌊t⌋<br />
Γ ⊢ ind(0; b; m,f m .t) = t 2 ∈ T<br />
by indRedBase<br />
Γ ⊢ b = t 2 ∈ T Ax<br />
Ax<br />
Γ ⊢ ind(s(n); b; m,f m .t) = t 2 ∈ T<br />
by indRedUp<br />
Γ ⊢ t[n, ind(n; b; m,f m .t) / m, f m ]<br />
= t 2 ∈ T Ax<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 123 <strong>Programmierung</strong> in der Typentheorie
Der NuPRL-Typ Z<br />
‘konservative’ Erweiterung der<br />
primitiv rekursiven Arithmetik<br />
• Ganze Zahlen als Gr<strong>und</strong>lage der Arithmetik<br />
– 0, 1, -1, 2, -2, ...<br />
• Elementare arithmetische Operationen vordefiniert<br />
– +, -, *, ÷, rem ,
Ganze Zahlen – Syntax<br />
(Typen)<br />
kanonisch<br />
(Elemente)<br />
nichtkanonisch<br />
int{}() natnum{n:n}() ind{}( u ; x,f x .s; base; y,f y .t)<br />
minus{}(natnum{n:n}()) minus{}( u ), add{}( u ; v ),<br />
sub{}( u ; v ), mul{}( u ; v ),<br />
div{}( u ; v ), rem{}( u ; v )<br />
int eq( u ; v ; s; t), less( u ; v ; s; t)<br />
Z n ind( u ; x,f x .s; base; y,f y .t)<br />
−n - u , u + v ,<br />
u - v , u * v ,<br />
u ÷ v , u rem v<br />
if u = v then s else t, if u < v then s else t<br />
lt{}(u;v) Axiom{}()<br />
u
Ganze Zahlen – Reduktion<br />
Redex<br />
ind(0; x,f x .s; base; y,f y .t)<br />
ind(n; x,f x .s; base; y,f y .t)<br />
ind(-n; x,f x .s; base; y,f y .t)<br />
-i<br />
i+j<br />
i-j<br />
i*j<br />
i÷j<br />
i rem j<br />
if i=j then s else t<br />
if i 0)<br />
β<br />
−→ s[-n,ind(-n+1; x,f x .s; base; y,f y .t) /x, f x ], (n > 0)<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
β<br />
−→<br />
Die Negation von i (als Zahl)<br />
Die Summe von i <strong>und</strong> j<br />
Die Differenz von i <strong>und</strong> j<br />
Das Produkt von i <strong>und</strong> j<br />
0, falls j=0; ansonsten die Integer-Division von i <strong>und</strong> j<br />
0, falls j=0; ansonsten der Rest der Division von i <strong>und</strong> j<br />
s, falls i = j; ansonsten t<br />
s, falls i < j; ansonsten t<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 126 <strong>Programmierung</strong> in der Typentheorie
Listen<br />
• Analog zur primitiv rekursiven Arithmetik<br />
– kanonisch: T list , [], t.l,<br />
– nichtkanonisch: list ind(L; base; x,l,f l .t)<br />
• Reduktion<br />
list ind([]; b; x,l,f xl .t)<br />
list ind(s.u; b; x,l,f xl .t)<br />
β<br />
−→ b<br />
β<br />
−→ t[s, u,list ind(u; b; x,l,f xl .t) /x, l, f xl ]<br />
⇒ Induktive Beweisführung ≡ Rekursives Programm<br />
– fortsetzbar auf komplexere Datenstrukturen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 127 <strong>Programmierung</strong> in der Typentheorie
Maximale Segmentsumme – formale Definitionen<br />
max(i,j)<br />
≡ if i
⊢ ∀a:Z list .∀a 1<br />
:Z.∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.a) ∧ M = maxseq(a 1<br />
.a)<br />
by all i THEN listE 1 THEN all i (Induktion auf a)<br />
|\<br />
| a:Z list , a 1<br />
:Z ⊢ ∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.[]) ∧ M = maxseq(a 1<br />
.[])<br />
| by ex i a 1<br />
THEN ex i a 1<br />
THEN and i<br />
| |\<br />
| | a:Z list , a 1<br />
:Z ⊢ a 1<br />
= maxbeg(a 1<br />
.[])<br />
| | by ... Anwendung arithmetischer Lemmata ...<br />
| \<br />
| a:Z list , a 1<br />
:Z ⊢ a 1<br />
= maxseq(a 1<br />
.[])<br />
| by ... Anwendung arithmetischer Lemmata ...<br />
\<br />
a:Z list , x:Z, l:Z list , v: ∀a 1<br />
:Z.∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.l) ∧ M = maxseq(a 1<br />
.l), a 1<br />
:Z<br />
⊢ ∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.(x.l)) ∧ M = maxseq(a 1<br />
.(x.l))<br />
by all e 4 x THEN thin 4<br />
\<br />
a:Z list , x:Z, l:Z list , a 1<br />
:Z, v 1<br />
: ∃L:Z.∃M:Z. L = maxbeg(x.l) ∧ M = maxseq(x.l)<br />
⊢ ∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.(x.l)) ∧ M = maxseq(a 1<br />
.(x.l))<br />
by ex e 5 THEN ex e 6 THEN and e 7<br />
\<br />
a:Z list , x:Z, l:Z list , a 1<br />
:Z, L:Z, M:Z, v 2<br />
: L = maxbeg(x.l), v 3<br />
: M = maxseq(x.l)<br />
⊢ ∃L:Z.∃M:Z. L = maxbeg(a 1<br />
.(x.l)) ∧ M = maxseq(a 1<br />
.(x.l))<br />
by ex i max(L+a 1<br />
,a 1<br />
) THEN ex i max(M, max(L+a 1<br />
,a 1<br />
)) THEN and i<br />
|\<br />
| a:Z list , x:Z, l:Z list , a 1<br />
:Z, L:Z, M:Z, v 2<br />
: L = maxbeg(x.l), v 3<br />
: M = maxseq(x.l)<br />
| ⊢ max(L+a 1<br />
,a 1<br />
) = maxbeg(a 1<br />
.(x.l))<br />
| by ... Anwendung arithmetischer Lemmata ...<br />
\<br />
a:Z list , x:Z, l:Z list , a 1<br />
:Z, L:Z, M:Z, v 2<br />
: L = maxbeg(x.l), v 3<br />
: M = maxseq(x.l)<br />
⊢ max(M, max(L+a 1<br />
,a 1<br />
)) = maxseq(a 1<br />
.(x.l))<br />
by ... Anwendung arithmetischer Lemmata ...<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 129 <strong>Programmierung</strong> in der Typentheorie
Teilmengenkonstrukt {x:S | P [x] }<br />
• Steigerung der “praktischen” Ausdruckskraft<br />
– Vermeidung überflüssiger Informationen in Extrakt-Termen<br />
– Natürliche Repräsentation von Teilmengen eines Typs<br />
• Simulation durch Produkttyp x:S×P [x] nicht sinnvoll<br />
– Beweis für P [x] bleibt Bestandteil eines Elements<br />
• Handhabung impliziten Wissens nötig<br />
– Beweisterm für P [x] nicht konstruktiv verwendbar<br />
– Wissen P [x] verwendbar in nichtkonstruktiven Teilbeweisen<br />
• Versteckte Hypothesen in Beweisen<br />
– Erzeugung durch setE (auch quotient eqE)<br />
– Freigabe in Teilzielen von Regeln, die Axiom generieren<br />
• Unabhängiges Teilmengenkonstrukt {S | P }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 130 <strong>Programmierung</strong> in der Typentheorie
Teilmengen – Semantik<br />
Typsemantik<br />
{x 1 :S 1 | T 1 } = {x 2 :S 2 | T 2 } falls S 1 =S 2 <strong>und</strong> es gibt eine Variable x, die weder in T 1<br />
noch in T 2 vorkommt, <strong>und</strong> zwei Terme p 1 <strong>und</strong> p 2 mit<br />
der Eigenschaft<br />
p 1 ∈ ∀x:S 1 . T 1 [x/x 1 ] ⇒ T 2 [x/x 2 ] <strong>und</strong><br />
p 2 ∈ ∀x:S 1 . T 2 [x/x 2 ] ⇒ T 1 [x/x 1 ].<br />
T = {S 2 | T 2 } falls T = {x 2 :S 2 | T 2 } für ein beliebiges x 2 ∈ V.<br />
{S 1 | T 1 } = T falls {x 1 :S 1 | T 1 } = T für ein beliebiges x 1 ∈ V.<br />
s = t ∈ {x:S | T }<br />
Elementsemantik<br />
falls {x:S | T } Typ <strong>und</strong> s = t ∈ S <strong>und</strong> es gibt einen<br />
Term p mit der Eigenschaft p ∈ T [s/x]<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 131 <strong>Programmierung</strong> in der Typentheorie
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Teilmengen – Inferenzregeln<br />
Γ ⊢ {x 1 :S 1 | T 1 } = {x 2 :S 2 | T 2 } ∈ U j<br />
Ax<br />
by setEq<br />
Γ ⊢ S 1 = S 2 ∈ U j<br />
Ax<br />
Γ, x:S 1 ⊢ T 1 [x/x 1 ] = T 2 [x/x 2 ] ∈ U j<br />
Ax<br />
Γ ⊢ s = t ∈ {x:S | T } Ax<br />
by elementEq j<br />
Γ ⊢ s = t ∈ S Ax<br />
Γ ⊢ T [s/x] Ax<br />
Γ, x ′ :S ⊢ T [x ′ /x] ∈ U j<br />
Ax<br />
Γ ⊢ {x:S | T } ⌊s⌋<br />
by elementI j s<br />
Γ ⊢ s ∈ S Ax<br />
Γ ⊢ T [s/x] Ax<br />
Γ, x ′ :S ⊢ T [x ′ /x] ∈ U j<br />
Ax<br />
Γ, z: {x:S | T }, ∆ ⊢ C ⌊(λy.t) z⌋<br />
by setE i<br />
Γ, z: {x:S | T }, y:S, [⌊v⌋]:T [y/x],<br />
∆[y/z] ⊢ C[y/z] ⌊t⌋<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 132 <strong>Programmierung</strong> in der Typentheorie
Quotiententypen x,y : T //E<br />
• Benutzerdefinierte Modifikation der Gleichheit auf T<br />
– E[s, t / x, y] bestimmt Gleichheit von s <strong>und</strong> t<br />
– Restklassen modulo E: E muß Typ einer Äquivalenzrelation sein<br />
• Gleichheit E[s, t / x, y] ist implizites Wissen von s <strong>und</strong> t<br />
• Type-Squashing für benutzerdefinierte Prädikate<br />
– |P | ≡ {0 ∈ Z | P }<br />
– reduziert Typ P auf “Wahrheitstyp”<br />
– erforderlich um Überstrukturierung auf x,y : T //E zu umgehen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 133 <strong>Programmierung</strong> in der Typentheorie
Quotiententypen – Semantik<br />
Typsemantik<br />
x 1 ,y 1 : T 1 //E 1<br />
= x 2 ,y 2 : T 2 //E 2<br />
falls T 1 = T 2 <strong>und</strong> es gibt (verschiedene) Variablen x, y, z, die weder in<br />
E 1 noch in E 2 vorkommen, <strong>und</strong> Terme p 1 , p 2 , r,s <strong>und</strong> t mit der<br />
Eigenschaft<br />
p 1 ∈ ∀x:T 1 .∀y:T 1 . E 1 [x, y/x 1 , y 1 ] ⇒ E 2 [x, y/x 2 , y 2 ] <strong>und</strong><br />
p 2 ∈ ∀x:T 1 .∀y:T 1 . E 2 [x, y/x 2 , y 2 ] ⇒ E 1 [x, y/x 1 , y 1 ] <strong>und</strong><br />
r ∈ ∀x:T 1 .E 1 [x, x/x 1 , y 1 ] <strong>und</strong><br />
s ∈ ∀x:T 1 .∀y:T 1 . E 1 [x, y/x 1 , y 1 ] ⇒ E 1 [y, x/x 1 , y 1 ] <strong>und</strong><br />
t ∈ ∀x:T 1 .∀y:T 1 .∀z:T 1 .<br />
E 1 [x, y/x 1 , y 1 ] ⇒ E 1 [y, z/x 1 , y 1 ] ⇒ E 1 [x, z/x 1 , y 1 ]<br />
Elementsemantik<br />
s = t ∈ x,y : T //E falls x,y : T //E Typ <strong>und</strong> s ∈ T <strong>und</strong> t ∈ T <strong>und</strong> es gibt einen Term<br />
p mit der Eigenschaft p ∈ E[s, t/x, y]<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 134 <strong>Programmierung</strong> in der Typentheorie
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Quotiententyp – Inferenzregeln<br />
Γ ⊢ x 1 ,y 1 : T 1 //E 1<br />
= x 2 ,y 2 : T 2 //E 2<br />
∈ U j<br />
Ax<br />
by quotientEq<br />
Γ ⊢ x 1 ,y 1 : T 1 //E 1<br />
∈ U j<br />
Ax<br />
Γ ⊢ x 2 ,y 2 : T 2 //E 2<br />
∈ U j<br />
Ax<br />
Γ ⊢ T 1 = T 2 ∈ U j<br />
Ax<br />
Γ, v: T 1 = T 2 ∈ U j , x:T 1 , y:T 1<br />
⊢ E 1 [x, y/x 1 , y 1 ] ⇒ E 2 [x, y/x 2 , y 2 ] Ax<br />
Γ, v: T 1 = T 2 ∈ U j , x:T 1 , y:T 1<br />
⊢ E 2 [x, y/x 2 , y 2 ] ⇒ E 1 [x, y/x 1 , y 1 ] Ax<br />
Γ ⊢ s = t ∈ x,y : T //E Ax<br />
by memberEq j<br />
Γ ⊢ x,y : T //E ∈ U j<br />
Ax<br />
Γ ⊢ s ∈ T Ax<br />
Γ ⊢ t ∈ T Ax<br />
Γ ⊢ E[s, t/x, y] Ax<br />
Γ, v: s = t ∈ x,y : T //E , ∆ ⊢ C ⌊u⌋<br />
by quotient eqE i j<br />
Γ, v: s = t ∈ x,y : T //E , [⌊v ′ ⌋]:E[s, t/x, y], ∆<br />
⊢ C ⌊u⌋<br />
Γ, v: s = t ∈ x,y : T //E , ∆, x ′ :T , y ′ :T<br />
⊢ E[x ′ , y ′ /x, y] ∈ U j<br />
Ax<br />
Γ ⊢ x,y : T //E ⌊t⌋<br />
by memberI j<br />
Γ ⊢ x,y : T //E ∈ U j<br />
Ax<br />
Γ ⊢ T ⌊t⌋<br />
Γ, z: x,y : T //E , ∆ ⊢ s = t ∈ S Ax<br />
by quotientE i j<br />
Γ, z: x,y : T //E , ∆, x ′ :T , y ′ :T<br />
⊢ E[x ′ , y ′ /x, y] ∈ U j<br />
Ax<br />
Γ, z: x,y : T //E , ∆ ⊢ S ∈ U j<br />
Ax<br />
Γ, z: x,y : T //E , ∆, x ′ :T , y ′ :T ,<br />
v: E[x ′ , y ′ /x, y]<br />
⊢ s[x ′ /z] = t[y ′ /z] ∈ S[x ′ /z] Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 135 <strong>Programmierung</strong> in der Typentheorie
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 11<br />
Rekursion in der Typentheorie<br />
1. Induktive Typen<br />
2. (Partiell) Rekursive Funktionen<br />
3. Unendliche Objekte<br />
4. Ergänzungen zugunsten der praktischen Anwendbarkeit
Rekursive Definition<br />
+ Effizientere <strong>und</strong> elegantere Algorithmen <strong>und</strong> Datentypen<br />
– Nichtterminierender Reduktionsketten möglich<br />
– Unentscheidbarkeiten<br />
⇒ Einbettung in terminierendes Beweiskonzept schwierig<br />
• Induktive Typkonstruktoren<br />
– Wohlf<strong>und</strong>ierte, rekursiv definierte Datentypen <strong>und</strong> ihre Elemente<br />
• Partiell Rekursive Funktionen<br />
– Totale Funktionen auf eingeschränktem Definitionsbereich<br />
– (fast exakter) Definitionsbereich aus Algorithmus ableitbar<br />
• Lässige Typkonstruktoren<br />
– Schließen über unendliche Objekte<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 137 Rekursion
Induktive Typen X = T [X]<br />
Repräsentation fast aller rekursiv definierten Konzepte<br />
• Semantik: Kleinster Fixpunkt der rechten Seite<br />
Formale Notation: rectype X = T X<br />
• T X muß “Induktionsanfang” ohne X enthalten<br />
T X darf X nur positiv in → Konstrukten enthalten<br />
• Kanonische Elemente gemäß Konstruktoren in T X<br />
Nichtkanonisches Element: let ∗ f(x) = t in f(e)<br />
– immer terminierende rekursive Funktionsauswertung auf e<br />
• Allgemeinste Form: parametrisierte simultane Rekursion<br />
– rectype X 1 (x 1 ) = T X1 and ... and X n (x n ) = T Xn select X i (a i )<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 138 Rekursion
Induktive Typen – Syntax <strong>und</strong> Semantik<br />
kanonisch<br />
nichtkanonisch<br />
(Typen)<br />
(Elemente)<br />
rec{}(X.T X )<br />
rec ind{}( e ; f,x.t)<br />
rectype X = T X let ∗ f(x) = t in f( e )<br />
Redex<br />
let ∗ f(x) = t in f(e)<br />
Kontraktum<br />
β<br />
−→ t[λy.let ∗ f(x) = t in f(y), e / f, x]<br />
rectype X 1 = T X1 = rectype X 2 = T X2<br />
s = t ∈ rectype X = T X<br />
Typsemantik<br />
falls T X1 [X/X 1 ] = T X2 [X/X 2 ] für alle Typen X<br />
Elementsemantik<br />
falls rectype X = T X Typ <strong>und</strong><br />
s = t ∈ T X [rectype X = T X / X]<br />
rectype X 1 = T X1 = rectype X 2 = T X2 ∈ U j falls T X1 [X/X 1 ]=T X2 [X/X 2 ] ∈ U j<br />
für alle Terme X mit X ∈ U j<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 139 Rekursion
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Induktive Typen – Inferenzregeln I<br />
Γ ⊢ rectype X 1 = T X1 = rectype X 2 = T X2 ∈ U j<br />
Ax<br />
by recEq<br />
Γ, X:U j ⊢ T X1 [X/X 1 ] = T X2 [X/X 2 ] ∈ U j<br />
Ax<br />
Γ ⊢ s = t ∈ rectype X = T X Ax<br />
by rec memEq j<br />
Γ ⊢ s = t ∈ T X [rectype X = T X / X]<br />
Γ ⊢ rectype X = T X ∈ U j<br />
Ax<br />
Ax<br />
Γ ⊢ rectype X = T X ⌊t⌋<br />
by rec memI j<br />
Γ ⊢ T X [rectype X = T X / X] ⌊t⌋<br />
Γ ⊢ rectype X = T X ∈ U j<br />
Ax<br />
Γ, z: rectype X = T X , ∆ ⊢ C ⌊t[z/x]⌋<br />
by recE unroll i<br />
Γ, z: rectype X = T X , ∆,<br />
x: T X [rectype X = T X / X],<br />
v: z = x ∈ T X [rectype X = T X / X]<br />
⊢ C[x/z] ⌊t⌋<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 140 Rekursion
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Induktive Typen – Inferenzregeln II<br />
Γ ⊢ let ∗ f 1 (x 1 ) = t 1 in f 1 (e 1 )<br />
= let ∗ f 2 (x 2 ) = t 2 in f 2 (e 2 ) ∈ T [e 1 /z]<br />
by rec indEq z T rectype X = T X j<br />
Γ ⊢ e 1 = e 2 ∈ rectype X = T X Ax<br />
Γ ⊢ rectype X = T X ∈ U j<br />
Ax<br />
Γ, P : (rectype X = T X )→IP j ,<br />
f: (y:{x:rectype X = T X | P (x) } → T [y/z]),<br />
x: T X [{x:rectype X = T X | P (x) } / X]<br />
⊢ t 1 [f, x / f 1 , x 1 ] = t 2 [f, x / f 2 , x 2 ] ∈ T [x/z]<br />
Ax<br />
Ax<br />
Γ, z: rectype X = T X , ∆ ⊢ C<br />
⌊let ∗ f(x) = t[λy.Λ / P ] in f(z)⌋<br />
by recE i j<br />
Γ, z: rectype X = T X , ∆<br />
⊢ rectype X = T X ∈ U j<br />
Ax<br />
Γ, z: rectype X = T X , ∆<br />
P : (rectype X = T X )→IP j ,<br />
f: (y:{x:rectype X = T X | P (x) } → C[y/z]),<br />
x: T X [{x:rectype X = T X | P (x) } / X]<br />
⊢ C[x/z] ⌊t⌋<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 141 Rekursion
Rekursive Funktionen f(x) = t[f, x]<br />
• Semantik: Kleinster Fixpunkt der rechten Seite<br />
Formale Notation: letrec f(x) = t<br />
• Analog zu let ∗ f(x) = t in f(e), aber<br />
– rekursive Struktur der Eingaben nicht vorgegeben<br />
⇒ kein Extraktterm einer Eliminationsregel<br />
⇒ flexiblerer Einsatz in <strong>Programmierung</strong> (“reale” Programme)<br />
⇒ induktive Struktur des Definitionsbereiches muß berechnet werden<br />
• S↛T : totale Funktionen auf Teilmenge von S<br />
– f ∈ S↛T simuliert durch f ∈ {x:S | dom(f)(x) } → T<br />
– dom(f)(x) reduziert zu rekursivem Datentyp, auf dem f terminiert<br />
– Exakte Beschreibung des Definitionsbreiches nicht immer möglich<br />
• Allgemeinste Form: parametrisierte simultane Rekursion<br />
– letrec f 1 (x 1 ) = t 1 and ... and f n (x n ) = t n select f i<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 142 Rekursion
Partiell rekursive Funktionen – Syntax <strong>und</strong> Semantik<br />
(Typen)<br />
kanonisch<br />
(Elemente)<br />
nichtkanonisch<br />
pfun{}(S; T ) fix{}(f,x.t) dom{}( f ), apply p{}( f ;t)<br />
S↛T letrec f(x) = t dom( f ), f (t)<br />
Redex<br />
(letrec f(x) = t) (u)<br />
dom(letrec f(x) = t)<br />
β<br />
Kontraktum<br />
−→ t[letrec f(x) = t, u / f, x]<br />
β<br />
−→ λx.rectype F = E[[t]]<br />
Typsemantik<br />
S 1 ↛T 1 = S 2 ↛T 2 falls S 1 = S 2 <strong>und</strong> T 1 = T 2<br />
Elementsemantik<br />
letrec f 1 (x 1 ) = t 1 = letrec f 2 (x 2 ) = t 2 ∈ S↛T falls S↛T Typ <strong>und</strong> für alle s 1 , s 2 mit s 1 =s 2 ∈ S<br />
{x:S | dom(letrec f 1 (x 1 ) = t 1 )(x) }<br />
= {x:S | dom(letrec f 2 (x 2 ) = t 2 )(x) } <strong>und</strong><br />
t 1 [letrec f 1 (x 1 ) = t 1 , s 1 / f 1 , x 1 ]<br />
= t 2 [letrec f 2 (x 2 ) = t 2 , s 2 / f 2 , x 2 ] ∈ T<br />
S 1 ↛T 1 = S 2 ↛T 2 ∈ U j falls S 1 = S 2 ∈ U j <strong>und</strong> T 1 = T 2 ∈ U j<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 143 Rekursion
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Partiell rekursive Funktionen – Inferenzregeln I<br />
Γ ⊢ S 1 ↛T 1 = S 2 ↛T 2 ∈ U j<br />
Ax<br />
by pfunEq<br />
Γ ⊢ S 1 = S 2 ∈ U j<br />
Ax<br />
Γ ⊢ T 1 = T 2 ∈ U j<br />
Ax<br />
Γ ⊢ (letrec f 1 (x 1 ) = t 1 )<br />
= (letrec f 2 (x 2 ) = t 2 ) ∈ S↛T Ax<br />
by fixEq j<br />
Γ ⊢ letrec f 1 (x 1 ) = t 1 ∈ S↛T Ax<br />
Γ ⊢ letrec f 2 (x 2 ) = t 2 ∈ S↛T Ax<br />
Γ ⊢ {x:S | dom(letrec f 1 (x 1 ) = t 1 )(x) }<br />
= {x:S | dom(letrec f 2 (x 2 ) = t 2 )(x) } ∈ U j<br />
Ax<br />
Γ, y: {x:S | dom(letrec f 1 (x 1 ) = t 1 )(x) }<br />
⊢ (letrec f 1 (x 1 ) = t 1 ) (y)<br />
= (letrec f 2 (x 2 ) = t 2 ) (y) ∈ T Ax<br />
Γ ⊢ letrec f(x) = t ∈ S↛T Ax<br />
by fixMem j<br />
Γ ⊢ S↛T ∈ U j<br />
Ax<br />
Γ, f ′ :S↛T , x ′ :S ⊢ E [ t[f ′ , x ′ /f, x] ] ∈ U j<br />
Ax<br />
Γ, f ′ :S↛T , x ′ :S, E [ t[f ′ , x ′ / f, x] ]<br />
⊢ t[f ′ , x ′ / f, x] ∈ T Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 144 Rekursion
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
¡<br />
Partiell rekursive Funktionen – Inferenzregeln II<br />
Γ ⊢ f 1 (t 1 ) = f 2 (t 2 ) ∈ T Ax<br />
by apply pEq S↛T<br />
Γ ⊢ f 1 = f 2 ∈ S↛T Ax<br />
Γ ⊢ t 1 = t 2 ∈ {x:S | dom(f 1 )(x) }<br />
Ax<br />
Γ, f: S↛T , ∆ ⊢ C ⌊t[f (s),Axiom / y, v]⌋<br />
by pfunE i s<br />
Γ, f: S↛T , ∆<br />
⊢ s ∈ {x:S | dom(f 1 )(x) } Ax<br />
Γ, f: S↛T , ∆, y:T , v: y = f (s) ∈ T<br />
⊢ C ⌊t⌋<br />
Γ ⊢ dom(f 1 ) = dom(f 2 ) ∈ S→IP j<br />
Ax<br />
by domEq S↛T<br />
Γ ⊢ f 1 = f 2 ∈ S↛T Ax<br />
Γ ⊢ S↛T ∈ U j<br />
Ax<br />
Γ ⊢ (letrec f(x) = t) (u) = t 2 ∈ T Ax<br />
by apply pRed<br />
Γ ⊢ t[letrec f(x) = t, u / f, x] = t 2 ∈ T<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 145 Rekursion
Lässige Typen X = T [X]<br />
Repräsentation unendlicher Konstrukte<br />
• Semantik: Größter Fixpunkt der rechten Seite<br />
Formale Notation: inftype X = T X<br />
• T X braucht keinen “Induktionsanfang”<br />
T X darf X nur positiv in → Konstrukten enthalten<br />
• Kanonische Elemente gemäß Konstruktoren in T X<br />
Nichtkanonisches Element: let ∞ f(x) = t in f(e)<br />
• Allgemeinste Form: parametrisierte simultane Rekursion<br />
Noch kein fester Bestandteil der Typentheorie<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 146 Rekursion
¡<br />
Inferenzregeln zum praktischen Arbeiten<br />
Γ ⊢ C ⌊t⌋<br />
by compute tagC<br />
Γ ⊢ C↓ tagC ⌊t⌋<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
by computeHyp i tagT<br />
Γ, z: T ↓ tagT , ∆ ⊢ C ⌊t⌋<br />
Γ ⊢ C ⌊t⌋<br />
by unfold def-name<br />
Γ ⊢ C ↓ ⌊t⌋<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
by unfoldHyp def-name i<br />
Γ, z: T ↓ , ∆ ⊢ C ⌊t⌋<br />
Γ ⊢ C ⌊t⌋<br />
by rev compute tagC<br />
Γ, ⊢ C↑ tagC ⌊t⌋<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
by rev computeHyp i tagT<br />
Γ, z: T ↑ tagT , ∆ ⊢ C ⌊t⌋<br />
Γ ⊢ C ↓ ⌊t⌋<br />
by fold def-name<br />
Γ ⊢ C ⌊t⌋<br />
Γ, z: T ↓ , ∆ ⊢ C ⌊t⌋<br />
by foldHyp def-name i<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
by replaceHyp i S j<br />
Γ, z: S, ∆ ⊢ C ⌊t⌋<br />
Γ, z: T , ∆ ⊢ T = S ∈ U j<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 147 Resümee
¡<br />
¡<br />
¡<br />
¡<br />
Inferenzregeln zum praktischen Arbeiten II<br />
Γ, z: T , ∆ ⊢ C ⌊t⌋<br />
by replaceHyp i S j<br />
Γ, z: S, ∆ ⊢ C ⌊t⌋<br />
Γ, z: T , ∆ ⊢ T = S ∈ U j<br />
Ax<br />
Γ ⊢ C ⌊t⌋<br />
by lemma theorem-name<br />
Γ ⊢ C ⌊t[σ]⌋<br />
by instantiate Γ ′ C ′ σ<br />
Γ ′ ⊢ C ′ ⌊t⌋<br />
Γ ⊢ t ∈ T Ax<br />
by extract theorem-name<br />
Γ ⊢ C ⌊t[y/x]⌋<br />
by rename y x<br />
Γ ⊢ C[x/y] ⌊t⌋<br />
Γ ⊢ s = t ∈<br />
by equality<br />
T<br />
Ax<br />
Γ ⊢ C ⌊t⌋<br />
by arith j<br />
Γ ⊢ s 1 ∈ Z<br />
.<br />
Ax<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 148 Resümee
Typentheorie im Rückblick<br />
• Inferenzsystem für Mathematik <strong>und</strong> <strong>Programmierung</strong><br />
– Formalisierung “natürlicher” Gesetze der zentralen Konzepte<br />
– Direkte Darstellung (keine Simulation) der zentralen Konzepte<br />
⇒ Umfangreiche Theorie<br />
– mathematische Gr<strong>und</strong>konstrukte, <strong>Logik</strong>,<br />
– Gr<strong>und</strong>konstrukte der <strong>Programmierung</strong>, Rekursion<br />
• Praktische Probleme<br />
– Beweise erfordern viel Schreibarbeit<br />
→ interaktive Beweissysteme<br />
– Beweise sind unübersichtlich (viele Regelanwendungen)<br />
– Beweise sind schwerzu finden (viele Regeln <strong>und</strong> Parameter)<br />
→ Automatisierung der Beweisführung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 149 Resümee
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 12<br />
Interaktive Beweissysteme<br />
1. ML als formale Beschreibungssprache<br />
2. Implementierung der Objektsprache<br />
– Terme<br />
– Regeln <strong>und</strong> Beweise<br />
3. Systemkomponenten<br />
– Bibliothekskonzepte, Kommandoebene, Text- <strong>und</strong> Termeditor<br />
– Beweiseditor, Definitionsmechanismus<br />
4. Zur Korrektheit der Implementierung
Automatisierung von Beweisführung<br />
• Proof Checking: Überprüfung formaler Beweise durch Computer<br />
– leicht zu programmieren<br />
– mühsam in Anwendung (minimale Automatisierung)<br />
• Proof Editing: Interaktive Entwicklung formaler Beweise<br />
– leicht verständlich, einfach zu programmieren<br />
– Idee/Regel durch Benutzer – Ausführung durch Computer<br />
• Theorem Proving: vollautomatische Suche nach Beweisen<br />
– Maschinennahe Beweisformulierung, aufwendige <strong>Programmierung</strong><br />
– schwer verständlich, kaum anwendbar für reichhaltige Theorien<br />
• Entscheidungsprozeduren<br />
– vollautomatische Entscheidung für Probleme kleiner Teiltheorien<br />
– Einbettung in interaktive Beweiseditoren möglich<br />
• Taktiken: programmierte Steuerung von Regelanwendungen<br />
– flexibel, leistungsfähig, sicher<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 151 Interaktive Beweiser
Beweisentwicklungssysteme – Komponenten<br />
Verständliche Beweis-/Programmentwicklung<br />
• Repräsentation objektsprachlicher Konzepte<br />
• Interaktiver Beweiseditor mit Extraktionsmechanismus<br />
• Definitionsmechanismus<br />
• Programmevaluator<br />
• Bibliothek<br />
• Kommandoebene<br />
• Text- <strong>und</strong> Termeditor<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 152 Interaktive Beweiser
ML – Gr<strong>und</strong>eigenschaften<br />
Systemimplementierung durch Formalisierung der Metasprache<br />
• Funktionale Programmiersprache höherer Stufe<br />
– Programmieren = Definition + Anwendung von Funktionen<br />
– Abstraktion über lokale Variablen in komplexen Ausdrücken<br />
(Werte für Variablen durch Matching bestimmbar)<br />
• Erweiterbare polymorphe Typdisziplin<br />
– Gr<strong>und</strong>konstrukte: int, bool, tok, string, unit,<br />
A->B, A#B, A+B, A list<br />
– anwenderdefinierbare abstrakte <strong>und</strong> rekursive Datentypen<br />
– Typechecking mit Hindley/Milner-Algorithmus<br />
• Kontrollierte Behandlung von Ausnahmen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 153 Interaktive Beweiser
Abstrakte Datentypen in ML<br />
abstype time = int # int<br />
with maketime(hrs,mins) = if hrs
Implementierung von Termen<br />
Informale Definitionen<br />
↦→ (abstrakte) Datentypen<br />
abstype var = tok<br />
with mkvar t = abs var t<br />
and dvar v = rep var v<br />
;;<br />
abstype level exp = tok + int<br />
with .<br />
abstype parm = int + tok + string + var + level exp + bool<br />
with .<br />
absrectype term = (tok # parm list) # bterm list<br />
and bterm = var list # term<br />
with mk term (opid,parms) bterms = abs term((opid,parms),bterms)<br />
and dest term t = rep term t<br />
and mk bterm vars t = abs bterm(vars,t)<br />
and dest bterm bt = rep bterm bt<br />
;;<br />
Konkrete Objektsprache in Tabellen <strong>und</strong> Bibliotheksobjekten<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 155 Interaktive Beweiser
Implementierung von Regeln <strong>und</strong> Beweisen<br />
• Abstrakte Definition der Typen rule and proof<br />
– keine unzulässige Manipulation von Beweisen möglich<br />
– Sicherheit des Beweissystems leicht zu garantieren<br />
• Regel = Dekomposition + Validierungsfunktion<br />
– Repräsentation durch Regelschemata<br />
– Aufbau des Beweisbaums nur durch Validierung<br />
– Anwendung durch Konversion in Taktik mit refine<br />
⇒ leichte Komposition von Regeln<br />
Konkrete Inferenzregeln in Bibliotheksobjekten<br />
• Korrektheit des Systems leicht verifizierbar<br />
– Überprüfe korrekte Repräsentation von Regeln (Text)<br />
– Verifiziere refine<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 156 Interaktive Beweiser
Regeln <strong>und</strong> Beweise – konkrete Datentypen<br />
abstype declaration = var # term<br />
with mk assumption v t = abs declaration(v,t)<br />
and<br />
;;<br />
dest assumption d = rep declaration d<br />
lettype sequent = declaration list # term;;<br />
abstype rule = .....<br />
absrectype proof = (declaration list # term) # rule # proof list<br />
with mk proof goal decs t = abs proof((decs,t), ⋄,[])<br />
and refine r p = let children = deduce children r p<br />
and validation= deduce validation r p<br />
in children, validation<br />
and hypotheses p = fst (fst (rep proof p))<br />
and conclusion p = snd (fst (rep proof p))<br />
and refinement p = fst (snd (rep proof p))<br />
and<br />
;;<br />
children p = snd (snd (rep proof p))<br />
lettype validation = proof list -> proof;;<br />
lettype tactic = proof -> (proof list # validation);;<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 157 Interaktive Beweiser
Bibliothek<br />
Formalisiertes mathematisches Textbuch<br />
• Objekte<br />
– Inhalt: Definitionen, Sätze+Beweise, Methoden, Anmerkungen<br />
– Verwaltungsinformation: Name, Art, Status, Position<br />
• Unterstrukturierung in Theorien<br />
• Gr<strong>und</strong>operationen zur Verwaltung<br />
– Erzeugen, Löschen, Editieren, Überprüfen<br />
– Verschieben, Laden von Datei, Ablegen<br />
• Zusätzliche Regeln: lemma, extract<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 158 Interaktive Beweiser
Kommandoebene<br />
Interface Beweisentwicklungssystem ←→ Benutzer<br />
• Kontrolle der Bibliothek<br />
• Aufruf von Editoren<br />
• Experimente mit Termen der Objektsprache<br />
• Experimente mit ML-Programmen (Interpreter)<br />
• Laden externer Dateien<br />
.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 159 Interaktive Beweiser
Termeditor<br />
Verständliche Notation in formalen Sprachen<br />
• Unterstützung interaktiver Beweisentwicklung<br />
– Darstellung mathematischer Notation auf dem Bildschirm<br />
– Kontextfreie Sprachen unakzeptabel<br />
⇒ Parser zu unflexibel<br />
• Termeingabe durch Struktureditor<br />
– Erzeugung des Termbaus durch Ausfüllen von Slots<br />
⇒ Effizienz: keine Dekodierung von Text nötig<br />
⇒ Flexibilität: freie Syntax <strong>und</strong> Mehrdeutigkeiten zulässig<br />
⇒ Eleganz: Kenntnis der genauen Syntax nicht erforderlich<br />
– Umdenken nötig: keine lineare Eingabe von Text<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 160 Interaktive Beweiser
Beweiseditor<br />
• Sichtbare Entwicklung von Beweisen<br />
– Baumeditor<br />
– Kontrolliertes Interface zu refine <strong>und</strong> mk proof goal<br />
• Lokale Sicht auf Beweise<br />
– Arbeiten im einzelnen Beweisknoten<br />
– Bewegung im Baum mit Maus <strong>und</strong> Sondertasten<br />
• Extraktionsmechanismus<br />
– Komposition der Extraktterme bei vollständigem Beweis<br />
Beweisplanung durch Anwender nötig<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 161 Interaktive Beweiser
Typischer Beweisknoten<br />
Name des Theorems<br />
EDIT THM intsqrt<br />
Status, Position relativ zur Wurzel # top 1<br />
Erste Hypothese des Beweisziels 1. x:N<br />
Konklusion ⊢ ∃y:N. y 2 ≤x ∧ x
Definitionsmechanismus<br />
• Essentiell für konservative Erweiterungen<br />
– einfache, verständliche <strong>und</strong> vertraute Notation<br />
• Textmakros hilfreich aber zu einfach<br />
• Abstraktionsmechanismus<br />
– Auffalten von Definitionen nur explizit<br />
– Metavariablen <strong>und</strong> Substitution 2. Stufe nötig<br />
• Displaymechanismus<br />
– elegante, leicht lesbare Textdarstellung<br />
(Formatierung, Klammerung, Abkürzung)<br />
– Hypertext-Technik erforderlich<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 163 Interaktive Beweiser
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 13<br />
Taktiken – programmierte Beweisführung<br />
1. Gr<strong>und</strong>konzepte des taktischen Beweisens<br />
– Verfeinerungstaktiken<br />
– Transformationstaktiken<br />
2. <strong>Programmierung</strong> von Taktiken<br />
3. Korrektheit taktisch geführter Beweise<br />
4. Erfahrungen im praktischen Umgang
Taktiken<br />
Benutzerdefinierte Erweiterung des Inferenzsystems<br />
• Programmierte Anwendung von Beweisregeln<br />
– Vorausplanung von Beweisen<br />
– Strategische Suche nach Beweisen<br />
– Modifikation von Beweisen<br />
– Strukturierung von Beweisen / Unterdrücken von Details<br />
– Integration von Beweis-/Syntheseverfahren in interaktive Systeme<br />
• Freiheit zum Experimentieren mit Beweisstrategien<br />
+<br />
Sicherheit gegenüber Fehlern beim Beweisen<br />
Satz: Das Resultat einer Taktik-Anwendung ist immer ein gültiger Beweis<br />
des zugr<strong>und</strong>eliegenden logischen Kalküls.<br />
• Kombination mit Definitionen <strong>und</strong> Lemmata sehr effizient<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 165 Taktiken
Verfeinerungstaktiken<br />
Abgeleitete (programmierte) Inferenzregeln<br />
• Anwendung: wie gewöhnlichen Kalkülregel<br />
• Sichtbar: Taktikname + ungelöste Teilziele<br />
• Interne Verarbeitung:<br />
1. prlgoal ←− aktuelle Beweissequenz<br />
Teilbaum unterhalb der Sequenz wird ignoriert<br />
2. Anwendung der Taktik auf prlgoal liefert Teilziele + Validierung<br />
3. Anwendung der Validierung auf Teilziele erzeugt Beweisbaum<br />
4. Aktuelle Beweisregel ←− Taktikname + Beweisbaum (intern)<br />
Aktuelle Teilziele ←− generierte Teilziele<br />
5. Fehlermeldung, falls Taktik nicht anwendbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 166 Taktiken
Transformationstaktiken<br />
Modifikation existierender Beweise<br />
(Kopieren, Expandieren, Komprimieren, Analogie, . . . )<br />
• Anwendung: spezieller Befehl<br />
• Sichtbar: gesamter erzeugter Beweisbaum (Regeln + Teilziele)<br />
• Interne Verarbeitung:<br />
1. prlgoal ←− gesamter aktueller Teilbeweis<br />
2. Anwendung der Taktik auf prlgoal liefert Teilziele + Validierung<br />
3. Anwendung der Validierung auf Teilziele erzeugt Beweisbaum<br />
4. Aktueller Beweisbaum ←− generierter Beweisbaum<br />
Taktikname wird nicht gespeichert<br />
5. Keine Änderung, falls Taktik nicht anwendbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 167 Taktiken
<strong>Programmierung</strong> von Taktiken<br />
• Umwandlung von Regeln in Taktiken mittels refine<br />
• Zusammensetzung von Taktiken durch Tacticals<br />
– t 1 THEN t 2 : “Wende t 2 auf alle von t 1 erzeugten Teilziele an”<br />
– t THENL [t 1 ; t 2 ; ..t n ]: “Wende t i auf das i-te von t erzeugte Teilziel an”<br />
– t 1 ORELSE t 2 : “Wende t 1 an. Falls dies fehlschlägt, wende t 2 an”.<br />
– Repeat t: “Wiederhole die Taktik t bis sie fehlschlägt”<br />
– Complete t: “Wende t nur an, wenn der Beweis vollständig wird”<br />
– Progress t: “Wende t nur an, wenn ein Fortschritt erzielt wird”<br />
– Try t: “Wende t an; falls dies fehlschlägt, lasse das Ziel unverändert”<br />
.<br />
• ML-Programme zur Steuerung von Taktikanwendungen<br />
– Ausführliche Analyse der Sequenzen zur Parameterbestimmung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 168 Taktiken
Implementierung von Tacticals<br />
ml curried infix ‘THENL‘ ;;<br />
ml curried infix ‘ORELSE‘ ;;<br />
let $THENL (tac: tactic) (tac list : tactic list) (pf:proof) =<br />
let subgoals, val = tac pf<br />
in<br />
if not length tac list = length subgoals<br />
then fail<br />
else let subgoalLists, valList = map apply tac list subgoals<br />
in<br />
(flatten subgoalLists),<br />
\proofs. val ( (mapshape (map length subgoalLists) valList) proofs)<br />
;;<br />
let $ORELSE (t1:tactic) (t2:tactic) pf = t1 pf ? t2 pf ;;<br />
let Complete (tac:tactic) (pf:proof) = let subgoals, val = tac pf<br />
in<br />
if null subgoals<br />
then subgoals, val<br />
else fail<br />
;;<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 169 Taktiken
ML-Programme als Taktiken<br />
Anwendung von hypothesis auf alle Hypothesen des Beweises<br />
let hypcheck (pf:proof) =<br />
let n = length (hypotheses pf)<br />
in<br />
;;<br />
letrec TryHyp pos =<br />
if pos
<strong>Programmierung</strong> der Taktik simple prover<br />
let hypcheck = TryAllHyps hypothesis ;;<br />
let contradiction = TryAllHyps false e ;;<br />
let conjunctionE = TryAllHyps and e ;;<br />
let existentialE = TryAllHyps ex e ;;<br />
let disjunctionE = TryAllHyps or e ;;<br />
let impChain = Chain impE hypcheck ;;<br />
let notChain = TryAllHyps not e THEN impChain ;;<br />
let nondangerousI pf<br />
let simple prover<br />
= let termkind = opid (conclusion pf)<br />
in<br />
if member termkind [‘all‘; ‘not‘; ‘implies‘;<br />
‘rev implies‘; ‘iff‘; ‘and‘]<br />
then Run (termkind ˆ ‘ i‘) pf<br />
else fail<br />
;;<br />
= Repeat<br />
( hypcheck<br />
ORELSE contradiction<br />
ORELSE conjunctionE<br />
ORELSE existentialE<br />
ORELSE nondangerousI<br />
ORELSE disjunctionE<br />
ORELSE notChain<br />
ORELSE impChain<br />
);;<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 171 Taktiken
<strong>Programmierung</strong> von Transformationstaktiken<br />
Markieren <strong>und</strong> Kopieren von Beweisen<br />
let Mark name pf = add saved proof name pf; Id pf ;;<br />
letrec copy pattern pattern pf =<br />
if is refined pattern<br />
then Try ( refine (refinement pattern)<br />
THENL (map copy pattern (children pattern))<br />
) pf<br />
else Id pf<br />
;;<br />
let Copy name = copy pattern (get saved proof name)<br />
saved proofs: globale Variable vom Typ (tok#proof) list<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 172 Taktiken
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 14<br />
Entscheidungsprozeduren – automatische Beweisführung<br />
1. Einsatzbereiche<br />
2. Entscheidungsprozedur für elementare Arithmetik<br />
3. Schließen über Gleichheit<br />
4. Grenzen der Anwendungsmöglichkeiten<br />
AUSBLICK
Entscheidungsprozeduren<br />
Fest eingebaute algorithmische Inferenzregeln<br />
• Sinnvoll, wenn nur “Wahrheit” gefragt<br />
– Variation bekannter mathematischer Erkenntnisse<br />
– Beweisdetails / Extraktterm ohne Bedeutung<br />
– formaler Beweis mit Taktiken zu aufwendig<br />
• Möglich, wenn Problem algorithmisch entscheidbar<br />
– schneller Test für Anwendbarkeit überhaupt<br />
– maschinennahe Charakterisierung für Gültigkeit<br />
– maschinennahes Entscheidungsverfahren<br />
• Erforderlich: Verifikation der Prozedur<br />
– Konsistenz mit dem Rest der Theorie (Typkonzept!)<br />
– Korrektheit <strong>und</strong> Vollständigkeit der Entscheidungsalgorithmen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 174 Entscheidungsprozeduren
Arithmetische Entscheidungsprozeduren<br />
• Praktische Beweisführung braucht arithmetische<br />
Entscheidungsprozedur<br />
– arithmetisches Schließen taucht fast überall auf<br />
– arithmetische Schlüsse liefern keine neuen Erkenntnisse<br />
– arithmetische Aussagen tauschen in vielen Erscheinungsformen auf<br />
– formale Beweise simpler arithmetischer Aussagen sind nicht leicht<br />
• Allgemeine Arithmetik ist unentscheidbar<br />
– glechmächtig mit Theorie der berechenbaren Funktionen<br />
⇒ Entscheidungsprozedur für eingeschränkte Arithmetik<br />
– Konstanten, Gr<strong>und</strong>operationen, Gr<strong>und</strong>vergleiche – keine Induktion<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 175 Entscheidungsprozeduren
A – Theorie der elementaren Arithmetik<br />
Formale Sprache: elementar-arithmetische Formeln<br />
– Terme aufgebaut aus ganzzahligen Konstanten, Variablen <strong>und</strong> +, -, *<br />
– Atomare Formeln t 1 ρ t 2 : t i Terme, ρ ∈ {=,≠,,≤,≥}<br />
– Formeln aufgebaut aus atomaren Formen mit ¬, ∧ , ∨ <strong>und</strong> ⇒<br />
Semantik: axiomatisch charakterisiert durch<br />
– Gleichheitsaxiome mit eingeschränkter Substitutivität<br />
– Axiome der Konstantenarithmetik<br />
– Ringaxiome der ganzen Zahlen<br />
– Axiome der diskreten linearen Ordnung<br />
– Definitionsaxiome für Ordnungsrelationen <strong>und</strong> Ungleichheiten<br />
– Monotonieaxiome<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 176 Entscheidungsprozeduren
arith – wichtige Voraussetzungen<br />
• Zu jeder elementar-arithmetischen Formel F gibt es eine äquivalente<br />
elementar-arithmetische Formel G in konjunktiver Normalform<br />
• Γ ⊢ G 1 ∨ ... ∨ G n gültig gdw. Γ, ¬G 1 ,...,¬G n<br />
(falls G 1 , . . . , G n entscheidbar)<br />
⊢ Λ gültig<br />
• Eine Menge F 1 [e 1 , .., e k / u 1 , .., u k ], . . . , F n [e 1 , .., e k / u 1 , .., u k ] von<br />
elementar-arithmetischen Formeln ist genau dann widersprüchlich,<br />
wenn F 1 , . . . , F n widersprüchlich ist.<br />
(e 1 , . . . , e k elementar-arithmetische Terme; u 1 , . . . , u k Variablen)<br />
• Γ = v 1 ≥ u 1 + c 1 , . . . , v n ≥ u n + c n ist genau dann widersprüchlich,<br />
wenn der Ordnungsgraph G von Γ einen positiven Zyklus besitzt.<br />
(v i /u i Variablen oder 0; c i nichtnegative Konstanten)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 177 Entscheidungsprozeduren
arith angewandt auf Γ ⊢ G 1 ∨ . . . ∨ G n<br />
1. Führe Monotonieschritte aus (erzeugt neue Hypothese)<br />
2. Transformiere in die Gestalt Γ, ¬G 1 ,...,¬G n ⊢ Λ.<br />
3. Zerlege Konjunktionen entsprechend der Regel and e<br />
4. Transformiere Ungleichungen x≠y in Disjunktion x≥y+1 ∨ y≥x+1<br />
5. Zerlege Disjunktionen (wie mit or e); betrachte Beweisziele separat.<br />
6. Entferne Hypothesen ohne atomare elementar-arithmetische Formeln<br />
7. Ersetze nicht elementar-arithmetische Teilterme durch Variablen.<br />
8. Transformiere Komparanden in Standardpolynome.<br />
9. Transformiere Komparanden in monadische lineare Polynome c + u i<br />
10. Konvertiere Hypothesen in Ungleichungen der Gestalt t 1 ≥t 2<br />
(t 1 Variable oder 0; t 2 ein monadisches lineares Polynom)<br />
11. Erzeuge den Ordnungsgraphen der Formelmenge:<br />
Knoten für jede Variablen/ Konstante; Kante u i<br />
c<br />
−→ u j<br />
für u i<br />
≥u j<br />
+c.<br />
12. Teste, ob der Ordnungsgraph einen positiven Zyklus hat.<br />
Generiere Wohlgeformtheitsziele oder Fehlermeldung.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 178 Entscheidungsprozeduren
Gleichheitsschließen<br />
Folgt eine Gleichheit aus anderen Gleichheiten?<br />
• Gleichheitsschließen wichtig für praktische<br />
Beweisführung<br />
– Reflexivität, Symmetrie, Transitivität <strong>und</strong> Substitution<br />
• Elementare Gleichheit ist entscheidbar<br />
– Hypothesen <strong>und</strong> Konklusion sind Gleichheiten<br />
– Semantik: Axiome der Reflexivität, Symmetrie, Transitivität <strong>und</strong> Substitution<br />
• Effiziente Verfahren verfügbar:<br />
– transitive Hülle einer Äquivalenzrelation berechnen<br />
– technisch durch Betrachtung des Relationsgraphen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 179 Entscheidungsprozeduren
Equality: graphentheoretische Voraussetzungen<br />
1. G = (V, E) gerichteter Graph<br />
– l(v): Markierung des Knoten v in G<br />
– δ(v): Anzahl der von v ausgehenden Kanten<br />
– v[i]: i-ter Nachfolgerknoten von v<br />
– u Vorgänger von v, wenn v = u[i] für ein i<br />
2. R Relation auf V .<br />
• u <strong>und</strong> v kongruent unter R, wenn l(u) = l(v), δ(u) = δ(v) <strong>und</strong><br />
(u[i], v[i]) ∈ R für alle i<br />
• R abgeschlossen unter Kongruenzen, wenn aus u <strong>und</strong> v<br />
kongruent unter R folgt, daß (u, v) ∈ R gilt<br />
• Der Kongruenzabschluß R ∗ von R ist die eindeutige minimale<br />
Erweiterung von R, die abgeschlossen unter Kongruenzen <strong>und</strong><br />
eine Äquivalenzrelation ist.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 180 Entscheidungsprozeduren
MERGE(R,u,v) – Algorithmus<br />
Berechne Kongruenzabschluß von R ∪ {(u, v)}<br />
Eingabe: G = (V, E) gerichteter Graph; R Äquivalenzrelation<br />
(abgeschlossen unter Kongruenzen); u, v ∈ V .<br />
1. Sind u <strong>und</strong> v in der gleichen Äquivalenzklasse von R , dann lasse<br />
R unverändert <strong>und</strong> beende die Berechnung.<br />
2. Andernfalls sei P u bzw. P v die Menge der Vorgänger von Knoten<br />
aus der Äquivalenzklasse von u bzw. v<br />
3. Modifiziere R: verschmelze Äquivalenzklassen von u <strong>und</strong> v.<br />
4. Wiederhole für alle x ∈ P u <strong>und</strong> y ∈ P v<br />
Falls die Äquivalenzklassen von x <strong>und</strong> y verschieden sind, aber<br />
x <strong>und</strong> y kongruent sind, so modifiziere R durch Aufruf von<br />
MERGE(R,x,y). Andernfalls lasse R unverändert.<br />
Ausgabe: modifizierte Relation R.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 181 Entscheidungsprozeduren
Entscheidungsprozedur für Gleichheit<br />
Quantorenfreies Schließen über Gleichheiten mit<br />
uninterpretierten Funktionssymbolen <strong>und</strong> Variablen<br />
Eingabe: Hypothesen s 1 =t 1 ,...,s n =t n ; Konklusion s=t<br />
1. Konstruiere Graphen G der Baumdarstellungen von<br />
s, s 1 , . . . , s n , t, t 1 , . . . , t n<br />
Setze R als Identitätsrelation auf den Knoten von G<br />
2. Wende schrittweise MERGE(R,τ (s i ),τ (t i )) für 1 ≤ i ≤ n an.<br />
3. Wenn τ (s) in der gleichen Äquivalenzklasse wie τ (t) liegt, dann<br />
sind s <strong>und</strong> t gleich.<br />
Andernfalls folgt s=t nicht aus s 1 =t 1 ,...,s n =t n<br />
τ (u): Wurzelknoten der Baumdarstellung von u in G.<br />
In NuPRL wegen Typbedingungen nur eingeschränkt einsetzbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 182 Entscheidungsprozeduren
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
• Ausdruckstarke Theorien sind unentscheidbar<br />
⇒ vollautomatische Beweissysteme nicht sinnvoll<br />
⇒ Beweissysteme interaktiv steuern<br />
– ergänzt durch Taktiken <strong>und</strong> Entscheidungsprozeduren<br />
• NuPRL: flexibles universelles Basissystem<br />
– Schließen über alle Bereiche von Mathematik <strong>und</strong> <strong>Programmierung</strong><br />
– Ausbau zu leistungsfähigen Inferenzsystem für beliebige Anwendungsgebiete<br />
durch Benutzer möglich<br />
• Forschungsrichtungen<br />
– Verbesserung der in das System integrierten Mechanismen<br />
– Strukturierung der mathematischen Bibliothek<br />
– Meta-Schließen, Reflektion, Analogie<br />
– praktische Anwendungen<br />
Kooperation zwischen Mensch <strong>und</strong> Computer verbessern<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 183 Entscheidungsprozeduren
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 15<br />
Programmsynthese<br />
1. Wissensbasiertes Softwareentwicklung<br />
2. Formale Gr<strong>und</strong>konzepte<br />
3. Leitbeispiel: Costas-Arrays
Wissensbasiertes Software-Engineering<br />
Automatisierung des Schrittes von der Spezifikation<br />
zum korrekten, ausführbaren Programm<br />
<strong>und</strong> Dokumentation getroffener Entscheidungen<br />
• Strategien zur Synthese von Algorithmen<br />
aus formalen Spezifikationen<br />
• Verfahren zum Erwerb von “Synthesewissen”<br />
• Hilfe beim Entwurf formaler Spezifikationen<br />
• Hilfsmittel zur<br />
– algorithmischen Optimierung,<br />
– Implementierung abstrakter Datentypen<br />
– sprachabhängigen Compilierung / Optimierung<br />
.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 185 Programmsynthese
Programmsynthese<br />
• Gr<strong>und</strong>konzepte<br />
– Phasen einer Synthese<br />
– Formale Gr<strong>und</strong>begriffe<br />
– Syntheseparadigmen<br />
• Beweise als Programme<br />
– Induktionsstrategien, Rippling, ....<br />
• Synthese durch Transformationen<br />
– LOPS<br />
• Synthese mit Algorithmenschemata<br />
– KIDS: Globalsuche, Divide & Conquer, Lokalsuche ....<br />
• Nachträgliche Optimierungen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 186 Programmsynthese
Phasen einer formalen Entwicklung von Software<br />
1. Erstellen der nötigen “Objekttheorie”:<br />
– Formalisierung vorkommender Begriffe<br />
– Aufstellen mathematischer Gesetze<br />
2. Erstellen der formalen Spezifikation<br />
3. Entwurf eines läuffähigen, korrekten Algorithmus<br />
4. Verifizierte algorithmische Optimierung<br />
5. Implementierung abstrakter Datentypen<br />
6. Compilierung <strong>und</strong> sprachabhängige Optimierung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 187 Programmsynthese
Programmsynthese: Formale Gr<strong>und</strong>begriffe<br />
• Spezifikation: Tupel spec = (D,R,I,O)<br />
Notation: FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
– D (Domain) <strong>und</strong> R (Range): Datentypen<br />
– I (Input-Bedingung an zulässige Eingaben): Prädikat über D<br />
– O (Output-Bedingung an mögliche Ausgaben): Prädikat über D×R<br />
D,R,I,O in Spezifikationssprache zu beschreiben<br />
• Programm: Tupel p = ( D,R,I,O, body )<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y) = body(x)<br />
– (D,R,I,O): Spezifikation<br />
– body:D↛R (Programmkörper): berechenbare Funktion<br />
body in Programmiersprache zu beschreiben (f darf vorkommen)<br />
• Programm p korrekt, falls gilt: ∀x:D. I(x) ⇒ O(x,body(x))<br />
• Spezifikation spec erfüllbar (synthetisierbar), falls eine Funktion<br />
body:D↛R existiert, so daß p=(spec,body) korrekt ist<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 188 Programmsynthese
Erweiterte formale Sprache – wichtigste<br />
Bestandteile<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 189 Programmsynthese
B, true, false Data type of boolean expressions, explicit truth values<br />
¬, ∧ , ∨ , ⇒ , ⇐ , ⇔ Boolean connectives<br />
∀x ∈ S.p, ∃x ∈ S.p<br />
Limited boolean quantifiers (on finite sets and sequences)<br />
if p then a else b<br />
Conditional<br />
Seq(α)<br />
Data type of finite sequences over members of α<br />
null?, ∈ , ⊑<br />
Decision procedures: emptiness, membership, prefix<br />
[], [a], [i..j], [a 1<br />
...a n<br />
] Empty/ singleton sequence, subrange, literal sequence former<br />
a.L, L·a<br />
prepend a, append a to L<br />
[f(x)|x ∈ L ∧ p(x)], |L|, L[i] General sequence former, length of L, i-th element,<br />
domain(L), range(L)<br />
The sets {1..|L|} and {L[i]|i ∈ domain(L)}<br />
nodups(L)<br />
Decision procedure: all the L[i] are distinct (no duplicates)<br />
Set(α)<br />
Data type of finite sets over members of α<br />
empty?, ∈ , ⊆<br />
Decision procedures: emptiness, membership, subset<br />
∅, {a}, {i..j}, {a 1<br />
...a n<br />
} Empty set, singleton set, integer subset, literal set former<br />
S+a, S-a<br />
{f(x)|x ∈ S ∧ p(x)}, |S|<br />
S∪T,<br />
⋃<br />
S∩T, S\T<br />
⋂<br />
FAMILY, FAMILY<br />
element addition, element deletion<br />
General set former, cardinality<br />
Union, intersection, set difference<br />
Union, intersection of a family of sets<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 190 Programmsynthese
Costas-Arrays: Problemstellung<br />
Costas Array der Größe n:<br />
Permutation von {1..n} ohne doppelte Elemente in den Zeilen der Differenzentafel<br />
2 4 1 6 5 3<br />
-2 3 -5 1 2<br />
1 -2 -4 3<br />
-4 -1 -2<br />
-3 1<br />
-1<br />
Costas Array der Ordnung 6 <strong>und</strong> seine Differenzentafel<br />
Ziel: Berechnung aller Costas Arrays der Größe n<br />
Programmsynthese 191 DEMO: Costas Arrays Synthese
Costas-Arrays (1): Objekttheorie<br />
• Formalisierung vorkommender Begriffe:<br />
dtrow(L,j) ≡ [L[i]-L[i+j] | i ∈ [1..|L|-j] ]<br />
perm(L,S) ≡ nodups(L) ∧ range(L)=S<br />
• Aufstellen mathematischer Gesetze:<br />
∀L,L’:Seq(Z).∀i:Z.∀j:N.<br />
1. dtrow([],j) = []<br />
2. j≤|L| ⇒ dtrow(i.L,j) = (i-L[j]).dtrow(L,j)<br />
3. j≠0 ⇒ dtrow([i],j) = []<br />
4. L⊑L’ ⇒ dtrow(L,j) ⊑ dtrow(L’,j)<br />
5. j≥|L| ⇒ dtrow(L,j) = []<br />
6. j≤|L| ⇒ dtrow(L·i,j) = dtrow(L,j)·(L[ |L|+1-j ]-i)<br />
Programmsynthese 192 DEMO: Costas Arrays Synthese
Costas-Arrays (2): formale Spezifikation<br />
FUNCTION Costas (n:Z):Set(Seq(Z)) WHERE n≥1<br />
RETURNS All-p<br />
SUCH THAT All-p =<br />
{p:Seq(Z)| perm(p,{1..n})<br />
∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
Kurzschreibweise<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n})<br />
∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
Programmsynthese 193 DEMO: Costas Arrays Synthese
Costas-Arrays (3): lauffähiger Algorithmus<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= if nodups([]) ∧ ∀j ∈ domain([]).nodups(dtrow([],j))<br />
then Costas aux (n,[]) else ∅<br />
FUNCTION Costas aux (n:Z,V:Seq(Z))<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= {p | p ∈ {V} ∧ perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
∪ ⋃ { Costas aux (n,W) | W ∈ {V·i|i ∈ {1..n}} ∧ nodups(W)<br />
∧ ∀j ∈ domain(W).nodups(dtrow(W,j)) }<br />
Programmsynthese 194 DEMO: Costas Arrays Synthese
COSTAS-ARRAYS (4a): CI-Simplifikationen<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧<br />
= Costas aux (n,[])<br />
∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
FUNCTION Costas aux (n:Z,V:Seq(Z))<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if perm(V,{1..n}) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j)) then {V} else ∅)<br />
∪ ⋃ { Costas aux (n,V·i) |i ∈ {1..n} ∧ nodups(V·i)<br />
∧ ∀j ∈ domain(V·i).nodups(dtrow(V·i,j))}<br />
Programmsynthese 195 DEMO: Costas Arrays Synthese
Costas-Arrays (4b): CD-Simplifikationen<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧<br />
= Costas aux (n,[])<br />
∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
FUNCTION Costas aux (n:Z,V:Seq(Z))<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if {1..n}⊆range(V) then {V} else ∅)<br />
∪ ⋃ { Costas aux (n,V·i) |i ∈ {1..n} ∧ i ∉ V<br />
∧ ∀j ∈ domain(V). (V[|V|+1-j]-i) ∉ dtrow(V,j) }<br />
Programmsynthese 196 DEMO: Costas Arrays Synthese
Costas-Arrays (4c): Finite Differencing<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧<br />
= Costas aux1 (n,[],{1..n})<br />
∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
FUNCTION Costas aux1 (n:Z,V:Seq(Z),Pool:Set(Z))<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
∧ Pool = {1..n}\range(V)<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if empty?(Pool) then {V} else ∅)<br />
∪ ⋃ { Costas aux1 (n,V·i,Pool−i) |i ∈ Pool<br />
∧ ∀j ∈ domain(V). (V[|V|+1-j]-i) ∉ dtrow(V,j) }<br />
Programmsynthese 197 DEMO: Costas Arrays Synthese
Costas-Arrays (4d): Case Analysis<br />
FUNCTION Costas (n:Z) WHERE n≥1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧<br />
= Costas aux2 (n,[],{1..n},1)<br />
∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
FUNCTION Costas aux2 (n:Z,V:Seq(Z), Pool:Set(Z),Vsize:Z)<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
∧ Pool = {1..n}\range(V) ∧ Vsize = |V|+1<br />
RETURNS {p:Seq(Z)| perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= if empty?(Pool)<br />
then {V}<br />
else ⋃ { Costas aux2 (n,V·i,Pool−i,Vsize+1) |i ∈ Pool<br />
∧ ∀j ∈ domain(V). (V[Vsize-j]-i) ∉ dtrow(V,j) }<br />
Programmsynthese 198 DEMO: Costas Arrays Synthese
Datentypverfeinerung<br />
Ersetze abstrakte Definitionen von Datentypen<br />
durch effiziente konkrete Implementierungen<br />
• Endliche Mengen<br />
– Listen: Standardimplementierung<br />
– Bitvektor: Mengen über endlichem Domain<br />
– charakteristische Funktion (effiziente Elementrelation)<br />
• Folgen<br />
– verkettete Liste: Standardimplementierung<br />
– umgekehrte Liste (gut für append-Operation ·)<br />
• System stellt Auswahl von Implementierungen bereit<br />
Benutzer legt Nichtstandard-Implementierung fest<br />
– separate für jede einzelne Variable<br />
Programmsynthese 199 DEMO: Costas Arrays Synthese
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 16<br />
Syntheseparadigmen<br />
1. Beweise als Programme<br />
2. Synthese durch Transformationen<br />
3. Algorithmenschemata
Syntheseparadigmen<br />
• Unterscheidungsmerkmale<br />
– Interne Aufgabenstellung (Darstellung des Problems)<br />
– Interne Lösungsmethode (Art der Inferenzen)<br />
– Konstruktionsmethode für Algorithmus (aus interner Lösung)<br />
• Beweise als Programme<br />
– Extraktion aus konstruktivem Beweis eines Theorems<br />
• Synthese durch Transformationen<br />
– Äquivalenzumformungen in ausführbare (rekursive) Form<br />
• Verwendung von Algorithmenschemata<br />
– Verfeinerung von Standardlösungen für bekannte algorithmische Gr<strong>und</strong>strukturen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 200 Syntheseparadigmen
Syntheseparadigmen: Beweise als Programme<br />
Gegeben sei die Spezifikation:<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
1. Wandle um in Spezifikationstheorem:<br />
– ∀x:D.∃y:R. I(x) ⇒ O(x,y)<br />
2. Suche formalen Beweis in konstruktivem logischen Kalkül.<br />
3. Extrahiere aus Beweis eine Methode, y aus x zu berechnen<br />
Forschung:<br />
– Ausdrucksstarke Kalküle<br />
– Effiziente Beweisstrategien <strong>und</strong> Beweisplaner (Induktion)<br />
– Effiziente Extraktionsmechanismen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 201 Syntheseparadigmen
Syntheseparadigmen: Synthese durch Transformation<br />
Gegeben sei die Spezifikation:<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
1. Definiere neues Prädikat F über D×R durch:<br />
– ∀x:D.∀y:R. I(x) ⇒ (F(x,y) ⇔ O(x,y)).<br />
2. Transformiere in äquivalente Formel der Gestalt:<br />
– ∀x:D.∀y:R. I(x) ⇒ (F(x,y) ⇔ O f (x,y))<br />
O f (x,y) darf nur aus erfüllbaren Prädikaten <strong>und</strong> Vorkommen von F bestehen<br />
3. Extrahiere aus der rekursiven Formel ein Programm.<br />
– Alternativ: Interpretation als <strong>Logik</strong>-Programm<br />
Forschung:<br />
– Leistungsfähige Transformationsregeln<br />
– effiziente Rewrite Techniken <strong>und</strong> Heuristiken<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 202 Syntheseparadigmen
Syntheseparadigmen: Algorithmenschemata<br />
Erzeuge Algorithmus in einem Schritt<br />
Gegeben sei die Spezifikation:<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
1. Wähle algorithmischen Klasse <strong>und</strong> (partielles) Schema<br />
2. Verfeinere Schema auf das Problem<br />
Vervollständige unbesetzte Parameter<br />
3. Instantiiere Algorithmenschema<br />
Forschung:<br />
– Analyse der Struktur einer Klasse von Algorithmen<br />
– Komponenten <strong>und</strong> Axiome für Korrektheit<br />
– Techniken zur Verfeinerung von Standardlösungen<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 203 Syntheseparadigmen
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 17<br />
Synthese–Strategien<br />
1. Übersicht<br />
2. Beweise als Programme: OYSTER/CLAM, PRECOMAS<br />
3. Synthese durch Transformationen
Synthese–Strategien<br />
Konkrete Verfahren zur<br />
Synthese von Algorithmen aus Spezifikationen<br />
• Steuern die Anwendung eines logischen Formalismus<br />
• Strukturieren den Lösungsweg durch interne Teilziele<br />
• Verarbeiten Programmierwissen<br />
• Lösen Teilziele durch heuristisch kontrollierte Suche<br />
• Hängen ab von Rückfragen an den Benutzer<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 205 Synthese–Strategien
Synthesestrategien: Historisch relevante Verfahren<br />
• Informale Methoden<br />
– Polya, Dijkstra, Gries, . . .<br />
• Beweiser mit Skolemisierung <strong>und</strong> Resolution<br />
– Green, 1969 (Stanford/Kestrel Institute)<br />
– Manna/Waldinger, 1971,75 (SRI International)<br />
Transformations- <strong>und</strong> Formationsregeln<br />
– Manna/Waldinger, 1972–1980<br />
Beweiskalkül gekoppelt mit Transformationen<br />
– Manna/Waldinger, 1980–<br />
• Fold/Unfold Techniken<br />
– Burstall/Darlington (Edinburgh) 1975–81<br />
• Modifizierte Knuth-Bendix Vervollständigung<br />
– Dershowitz (Illinois) 1985–<br />
• Synthese von <strong>Logik</strong>programmen<br />
– Clark, Hogger (London) 1980 –<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 206 Synthese–Strategien
Beweise als Programme:OYSTER/CLAM Beweisplaner<br />
• Planer simuliert Kalkül — Beweiser führt Beweisplan aus<br />
– Verzögerung von Entscheidungen durch Skolemvariablen <strong>und</strong> Unifikation<br />
• Induktionsbeweise<br />
– Induktionsschema ⇐ Analyse der Rekursionsstruktur + globales Schema<br />
– Rippling: Verschiebe Unterschiede zwischen Induktionshypothese <strong>und</strong> -schluß<br />
bis Funktion der Hypothese entsteht<br />
Literatur:<br />
– A. B<strong>und</strong>y, A. Smaill, G. Wiggins. The synthesis of logic programs from inductive proofs.<br />
Computer Logic Proceedings, Brussels. Springer Verlag, 1990.<br />
– A. B<strong>und</strong>y, F. van Harmelen, J. Hesketh, A. Smaill. Experiments with proof plans for induction.<br />
JAR 7:303–324, 1991.<br />
– A. B<strong>und</strong>y. The use of explicit plans to guide inductive proofs. Proc. CADE-9, Springer LNCS 310,<br />
111–120, 1988.<br />
– A. B<strong>und</strong>y. Automatic guidance of program synthesis proofs. Workshop on Automating Software<br />
Design, IJCAI-89, 57–59, 1989.<br />
– A. B<strong>und</strong>y, F. van Harmelen, A. Smaill, A. Ireland. Extensions to the rippling-out tactic for<br />
guiding inductive proofs. Proc. CADE-10, Springer LNCS 449, 132–146, 1990.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 207 Beweise als Programme
Beweise als Programme: PRECOMAS: Constructive Matching<br />
Synthese durch induktives Theorembeweisen<br />
• Start mit<br />
∀x:D. ∃y:R.O(x,y).<br />
• Zerlege O(x,y) syntaktisch in atomare Prädikate<br />
P 1<br />
(t 1<br />
(x,y),...t n<br />
(x,y)) ∧ ... ∧ P m<br />
(t 1<br />
(x,y),...t n<br />
(x,y))<br />
• Für jedes atomare Prädikat wähle festen Term t i<br />
;<br />
ersetze die anderen durch freie Parameter ξ j .<br />
• Entfalte Definitionen bis ξ j gegen t j<br />
(x,y) matchen<br />
– Im Basisfall verwende Definitionen der Theorie<br />
– Im Induktionsfall verwende zusätzlich ∀x’:R. x’
Beweise als Programme: Eigenschaften<br />
• Korrektheit des Programms ist garantiert<br />
• Verschiedene Kalküle sind theoretisch äquivalent<br />
– große praktische Unterschiede<br />
– Sequenzenkalküle für Mensch <strong>und</strong> Maschine geeignet<br />
• Verschiedene Extraktionsverfahren<br />
– beeinflussen Effizienz erzeugter Programme<br />
• Beweisschritte zu atomar (Assemblerniveau)<br />
– Beweise interaktiv kaum durchführbar<br />
– Automatisierung schwierig:<br />
Analyse der Formel, Unifikation, Suche nach geeigneten Induktionen<br />
↦→ praktisch nur sinnvoll in Kombination mit Definitionen <strong>und</strong> Spezialtaktiken<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 209 Beweise als Programme
Synthese durch Transformation<br />
• Historisch: Optimierung von Programmen<br />
– Erzeuge abstraktes, verifiziertes Prototyp-Programm<br />
– Transformiere in äquivalentes effizienteres Programm<br />
• Synthese: Optimierung “nichtausführbarer” Programme<br />
– Spezifikation ≡ nichtausführbares Programm<br />
– Transformiere in äquivalente, ausführbare Formel<br />
Individuelle Formalismen variieren sehr stark<br />
• Forschung:<br />
– effiziente Rewrite-Techniken<br />
– Heuristiken zur Steuerung von Vorwärtsinferenzen<br />
Literatur:<br />
– R. M. Burstall, J. Darlington: A Transformation System for Developing Recursive Programs,<br />
JACM 24:44-67, 1977.<br />
– C. J. Hogger: Derivation of Logic Programs, JACM 28:372–392, 1981.<br />
– Z. Manna, R. J. Waldinger: Synthesis: Dreams ⇒ Programs, IEEE.SE SE-5 (4):294–328, 1979.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 210 Synthese durch Transformationen
Transformationen<br />
• Anwendung bedingter Ersetzungsregeln der Form<br />
∀z:T. P(z) ⇒ ( Q(z) ⇔ Q’(z) )<br />
“Ersetze Vorkommen von Q(z) durch Q’(z), falls Bedingung P(z) erfüllt”<br />
Äquivalenzen oder Verfeinerungen (Implikationen)<br />
• Regeln ergeben sich aus<br />
– Lemmata der Wissensbasis<br />
– Dynamisch erzeugte Definitionen<br />
– Elementare Tautologien <strong>und</strong> Abstraktionen<br />
– Dynamisch erzeugte Kombinationen<br />
• Kalkül nicht zielgerichtet<br />
⇒ heuristische Steuerung notwendig<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 211 Synthese durch Transformationen
Transformationen: Maximale Segmentsumme (1)<br />
Bestimme maximale Summe Σ p+q<br />
i=p<br />
L[i] der Teilfolgen einer Liste L<br />
1. Definiere neues Prädikat maxseg:<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒<br />
maxseg(L,m) ⇔ m = MAX( ⋃ { {Σ q i=p L[i] |p ∈ {1..q}} | q ∈ {1..|L|} })<br />
2. Generalisiere: Einführung eines Prädikats max aux:<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒<br />
maxseg(L,m) ⇔ ∃l:Z. max aux(L,m,l)<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒<br />
max aux(L,m,l) ⇔ m = MAX( ⋃ { {Σ q i=p L[i] |p ∈ {1..q}} | q ∈ {1..|L|} })<br />
∧ l = MAX({Σ q i=1 L[i] |q ∈ {1..|L|} })<br />
3. Transformation durch Anwendung von Lemmata<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒ max aux(L,m,l)<br />
⇔ |L|=1 ∧ m=L[1] ∧ l=L[1]<br />
∨ |L|>1 ∧ ∃m’,l’:Z. l’ = MAX({Σ q i=2 L[i] | q ∈ {2..|L|}}<br />
∧ m’ = MAX( ⋃ { {Σ q i=p L[i] |p ∈ {2..q}} | q ∈ {2..|L|} })<br />
∧ l=max(L[1],l’+L[1]) ∧ m=max(l,m’)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 212 Synthese durch Transformationen
Transformationen: Maximale Segmentsumme (2)<br />
4. Umschreiben der Indizes relativ zu rest(L)<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒ max aux(L,m,l)<br />
⇔ |L|=1 ∧ m=L[1] ∧ l=L[1]<br />
∨ rest(L)≠[]<br />
∧ ∃m’,l’:Z. l’ = MAX({Σ q i=1 rest(L)[i] | q ∈ {1..|rest(L)|}})<br />
∧ m’= MAX( ⋃ { {Σ q i=p rest(L)[i] |p ∈ {1..q}} | q ∈ {1..|rest(L)|} })<br />
∧ l=max(L[1],l’+L[1]) ∧ m=max(l,m’)<br />
5. Einsetzen der Definition von max aux:<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒ max aux(L,m,l)<br />
⇔ |L|=1 ∧ m=L[1] ∧ l=L[1]<br />
∨ rest(L)≠[] ∧ ∃m’,l’:Z. max aux(rest(L),m’,l’)<br />
6. PROLOG-artiges Programm<br />
∧ l=max(L[1],l’+L[1]) ∧ m=max(l,m’)<br />
maxseg(L,m) :- max aux(L,l,m).<br />
max aux([a],a,a).<br />
max aux(a.L’,l,m):- max aux(L,m’,l’), max(a,l’+a,l), max(l,m’,m).<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 213 Synthese durch Transformationen
Transformationen:Erzeugung funktionaler Programme<br />
• Disjunktion<br />
↦−→ Fallunterscheidung<br />
– Sind (D,R,I,O,body) <strong>und</strong> (D,R,I’,O’,body’) korrekt, dann auch<br />
FUNCTION f(x:D):R WHERE I(x) ∨ I’(x) RETURNS y SUCH THAT O(x,y) ∨ O’(x,y)<br />
= if I(x) then body(x) else body’(x)<br />
• Konjunktion<br />
• Existenzquantor<br />
↦−→ Einschränkung legaler Eingaben<br />
↦−→ Generalisierung<br />
– Sind (D,R,I,O,body) <strong>und</strong> (R,R’,J,O’,body’) korrekt, dann auch<br />
FUNCTION f(x:D):R’ WHERE I(x) ∧ J(body(x))<br />
RETURNS z SUCH THAT ∃y:R. O(x,y) ∧ O’(y,z)<br />
= body’(body(x))<br />
• Rekursive Formel ↦−→ Rekursion (Terminierungsbeweis nötig!)<br />
– f d :D↛D wohlf<strong>und</strong>ierte ‘Reduktionsfunktion’ (keine absteigenden Ketten) <strong>und</strong><br />
1. ∀x:D. I(x) ⇒ I(f d (x))<br />
2. ∀x:D.∀y:R. I(x) ⇒ O(x,y) ⇔ ∃y r :R. O(f d (x),y r ) ∧ O C (x,f d (x),y r ,y)<br />
3. FUNCTION f C (x,x r ,y r :D×D×R):R WHERE I(x) RETURNS y SUCH THAT O C (x,x r ,y r ,y)<br />
= body(x,x r ,y r ) ist korrekt<br />
dann ist das folgende rekursive Programm korrekt<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y) = body(x, f d (x), f(f d (x)))<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 214 Synthese durch Transformationen
Programmerzeugung: Maximale Segmentsumme<br />
Resultat der Transformationen<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒<br />
maxseg(L,m) ⇔ ∃l:Z. max aux(L,m,l)<br />
∀L:Seq(Z).∀m:Z. L≠[] ⇒ max aux(L,m,l)<br />
⇔ |L|=1 ∧ m=L[1] ∧ l=L[1]<br />
∨ rest(L)≠[] ∧ ∃m’,l’:Z. max aux(rest(L),m’,l’)<br />
Erzeugtes funktionales Programm<br />
∧ l=max(L[1],l’+L[1]) ∧ m=max(l,m’)<br />
FUNCTION Maxseg(L:Seq(Z)):Z<br />
= snd( Max aux(L) )<br />
WHERE L≠[] RETURNS m SUCH THAT maxseg(L,m)<br />
FUNCTION Max aux(L:Seq(Z)):Z×Z WHERE L≠[]<br />
RETURNS m,l SUCH THAT max aux(L,m,l)<br />
= if |L|=1 then (L[1],L[1])<br />
else let (m’,l’) = Max aux(rest(L)) in<br />
let l=max(L[1],l’+L[1]) in<br />
( max(l,m’), l)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 215 Synthese durch Transformationen
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 18<br />
LOPS<br />
1. Übersicht<br />
2. GUESS/DOMAIN<br />
3. GET-REC<br />
4. Sonstige Strategien
LOPS – LOgische ProgrammSynthese<br />
• Syntaktische Transformationen logischer Formeln<br />
kontrolliert durch semantische Informationen<br />
• Kombination einer kleinen Menge von Teilstrategien<br />
– GUESS/DOMAIN: Raten einer Teillösung<br />
– GET-REC: Rekursionseinführung<br />
– Vereinfachung<br />
– Erzeugung von Unterproblemen<br />
– Test auf Auswertbarkeit von Teilformeln<br />
– .<br />
• Algorithmenkonstruktion:<br />
– Umformung rekursiver Formeln in logische/funktionale Programme<br />
Literatur:<br />
– Wolfgang Bibel: Syntax–directed, Semantics–supported Program Synthesis AIJ 14:243–261, 1980<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 217 LOPS
LOPS: Maximum-Synthese (1)<br />
Bestimme das Maximum m einer nichtleeren Menge S:Set(Z)<br />
0. Definiere neues Prädikat max durch<br />
∀S:Set(Z).∀m:Z. S≠∅ ⇒ max(S,m) ⇔ (m ∈ S ∧ ∀x ∈ S. x≤m)<br />
Markiere S als Input-Variable <strong>und</strong> m als Output-Variable.<br />
1. Die Formel ist nicht auswertbar<br />
2. GUESS/DOMAIN:<br />
– Rate eine Zahl g. Beschränke Auswahlmöglichkeiten auf Werte g ∈ S<br />
– Geratene Zahl ist direkte Lösung oder Gr<strong>und</strong>lage für Problemreduktion<br />
<strong>und</strong> Einführung von Rekursion<br />
Transformiere Ausgangsformel in<br />
∀S:Set(Z).∀m:Z. S≠∅ ⇒<br />
max(S,m) ⇔ ∃g:Z. g ∈ S ∧ (m ∈ S ∧ ∀x ∈ S.x≤m ∧ g≠m ∨ g=m)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 218 LOPS
LOPS: Strategie GUESS/DOMAIN<br />
Gezieltes Raten liefert verwertbare Information<br />
Transformiere:<br />
∀x:D.∀y:R. I(x) ⇒ P(x,y) ⇔ O(x,y)<br />
in die Form<br />
∀x:D.∀y:R. I(x) ⇒ P(x,y)<br />
⇔ ∃g:G. DC(x,g) ∧ (O(x,y) ∧ t(g,y) ∨ ¬t(g,y))<br />
Parameter der GUESS-Transformation<br />
• G: Datentyp der “Guess-Variable” g.<br />
In einfachen Fällen identisch mit R<br />
• t: Tautologie-Relation zwischen y <strong>und</strong> g.<br />
In einfachen Fällen die Gleichheit, sonst “g ist Teil von y”<br />
• Bedingung an Lösungen, von denen Teile geraten werden können<br />
Prädikat displayable(y) ˆ= ∃g:G.t(g,y)<br />
• DC: Bedingung an sinnvolle Ratewerte (Domain von g)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 219 LOPS<br />
↦→ Wissensbank<br />
↦→ Wissensbank<br />
↦→ Wissensbank<br />
↦→ Heuristik DOMAIN
LOPS: Heuristik DOMAIN<br />
Beschränke Ratemöglichkeiten auf leicht zu bestimmende Werte<br />
<strong>und</strong> versuche, die Möglichkeit falscher Rateschritte klein zu halten<br />
• Spezifikation (D,G,I,DC) muß erfüllbar sein.<br />
• Darstellbare Anteile von Lösungen müssen erreichbar sein<br />
{g:G | ∃y:R. O(x,y) ∧ t(g,y)} ⊆ {g:G | DC(x,g)}<br />
Formal: DC notwendig für darstellbare Anteile von Lösungen<br />
∀x:D.∀g:G. I(x) ⇒ (∃y:R. O(x,y) ∧ t(g,y)) ⇒ DC(x,g)<br />
Im einfachen Fall: DC “Echte Teilformel” von O<br />
• Menge ungeeigneter Werte ({g:G | DC(x,g) ∧ ¬t(g,y)}) soll klein sein<br />
• Effizienter Algorithmus zur Lösung von (D,G,I,DC) soll existieren<br />
⇒ Benutzerhilfe nötig für letzte beiden Kriterien<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 220 LOPS
LOPS: Zerlegung in Teilprobleme<br />
Zerlege Resultat von GUESS/DOMAIN in drei Teilprobleme<br />
∀x:D.∀y:R. I(x) ⇒ P(x,y) ⇔ ∃g:G. DC(x,g) ∧ (O 1<br />
(x,g,y) ∨ O 2<br />
(x,g,y))<br />
∀x:D.∀g:G.∀y:R. I(x) ∧ DC(x,g) ⇒<br />
∀x:D.∀g:G.∀y:R. I(x) ∧ DC(x,g) ⇒<br />
O 1<br />
(x,g,y) ⇔ O(x,y) ∧ t(g,y)<br />
O 2<br />
(x,g,y) ⇔ O(x,y) ∧ ¬t(g,y)<br />
⇒ Lösung der Unterprobleme bestimmt Gesamtlösung, wenn DC erfüllbar<br />
LOPS: Maximum-Synthese (2)<br />
3....S≠∅ ⇒ max(S,m) ⇔ ∃g:Z. g ∈ S ∧ (m ∈ S ∧ ∀x ∈ S.x≤m ∧ , g≠m ∨ g=m) wird zerlegt in<br />
∀S:Set(Z).∀m:Z. S≠∅ ⇒<br />
max(S,m) ⇔ ∃g:Z. g ∈ S ∧<br />
(max1(S,g,m) ∨ max2(S,g,m))<br />
∀S:Set(Z).∀g,m:Z. S≠∅ ∧ g ∈ S ⇒<br />
max1(S,g,m) ⇔ m ∈ S ∧ ∀x ∈ S. x≤m ∧ g≠m<br />
∀S:Set(Z).∀g,m:Z. S≠∅ ∧ g ∈ S ⇒<br />
max2(S,g,m) ⇔ m ∈ S ∧ ∀x ∈ S. x≤m ∧ g=m<br />
DC(g,S) ˆ= g ∈ S ist erfüllbar,<br />
Lösung des dritten Teilproblems steht fest<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 221 LOPS
LOPS: Maximum-Synthese (3)<br />
4. GET-REC: Transformiere in rekursive Variante der Ausgangsformel<br />
– Instantiiere Rekursionsschema für endliche Mengen<br />
“Versuche, P(S) durch P(S-g) auszudrücken”<br />
– Wende Lemmata der Wissensbank an<br />
1. S≠∅ ⇔ S={g} ∨ S-g ≠ ∅<br />
2. g ∈ S ⇒ g≠m ∧ m ∈ S ⇔ g≠m ∧ m ∈ S-g<br />
3. g ∈ S ⇒ ∀x ∈ S. x≤m ⇔ g≤m ∧ ∀x ∈ S-g. x≤m<br />
– Zerlege Vorbedingung in Basis- & Rekursionsfall<br />
Resultat der Transformation<br />
∀S:Set(Z).∀g,m:Z. S={g} ∧ g ∈ S ⇒<br />
max1(S,g,m) ⇔ m ∈ S ∧ ∀x ∈ S. x≤m ∧ g≠m<br />
↦→ Terminierung garantiert<br />
∀S:Set(Z).∀g,m:Z. S-g ≠ ∅ ∧ g ∈ S ⇒<br />
max1(S,g,m) ⇔ m ∈ S-g ∧ ∀x ∈ S-g. x≤m ∧ g≠m ∧ g≤m<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 222 LOPS
LOPS: Strategie GET-REC<br />
Goal-oriented Equivalence Transformation<br />
• Ziel: Rekursive Form<br />
– Disjunktion in der Input-Bedingung<br />
– Konjunktionen in der Output-Bedingung<br />
– Außer O nur erfüllbare Prädikate<br />
• Methode: Suche nach geeigneten Lemmata<br />
– Beziehung zwischen reduzierter <strong>und</strong> nichtreduzierter Form der Prädikate<br />
• Hilfsmittel:<br />
– Wohlf<strong>und</strong>iertes Rekursionsschema ↦→ Wissensbank<br />
– Suchheuristik<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 223 LOPS
LOPS: Maximum-Synthese (4)<br />
5. Simplifikation durch gerichtete Lemmata<br />
∀S:Set(Z).∀m:Z. S≠∅ ⇒<br />
max(S,m) ⇔ ∃g:Z. g ∈ S ∧<br />
∀S:Set(Z).∀g,m:Z. S={g} ⇒<br />
max1(S,g,m) ⇔ false<br />
∀S:Set(Z).∀g,m:Z. S-g ≠ ∅ ∧ g ∈ S ⇒<br />
max1(S,g,m) ⇔ max(S-g,m) ∧ g
LOPS: Konstruktion logischer Programme<br />
• ∀ entfällt im Programmkopf<br />
• ∃ entfällt im Programmkörper<br />
• Disjunktionen werden ersetzt durch einen Aufruf.<br />
– Der zugehörige Programmkopf wird entsprechend umbenannt<br />
• Vorbedingungen entfallen<br />
• Unerfüllbare Teile entfallen<br />
• Gleichheit wird verschoben in den Programmkopf<br />
• Funktionsaufrufe werden ersetzt durch prädikative<br />
Programme mit neuer Ausgabevariable<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 225 LOPS
LOPS:Integration in allgemeines Konzept – simple Variante<br />
Ist (D,R,↘) ein wohlf<strong>und</strong>iertes Rekursionsschema <strong>und</strong> gilt<br />
∀x:D.∀g:R. I(x)<br />
⇔ I base (x,g) ∨ I(x↘g)<br />
∀x:D.∀g,y,y r :R. DC(x,g) ∧ ¬O(x,g) ∧ g≠y ⇒<br />
O(x,y) ⇔ O(x↘g,y r ) ∧ O rec (x,g,y r ,y)<br />
<strong>und</strong> sind die folgenden Programme korrekt<br />
FUNCTION f DC (x:D):R WHERE I(x) RETURNS g SUCH THAT DC(x,g) = f dc (x)<br />
FUNCTION f BASE (x,g:D×R):R WHERE I base (x) ∧ DC(x,g) ∧ ¬O(x,g)<br />
RETURNS y SUCH THAT O(x,y) ∧ g≠y = f base (x,g)<br />
FUNCTION f REC (x,g,y r :D×R×R):R WHERE I(x↘g) ∧ DC(x,g) ∧ ¬O(x,g) ∧ O(x↘g,y r )<br />
RETURNS y SUCH THAT g≠y ∧ O rec (x,g,y r ,y) = f rec (x,g,y r )<br />
dann ist das folgende rekursive Programm korrekt<br />
FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
= let g=f dc (x) in if O(x,g) then g<br />
else if I base (x,g) then f base (x,g)<br />
else f rec (x,g,f(x↘g))<br />
Erweiterung: allgemeines GUESS, komplexere Rekursion, mengenwertige Funktionen<br />
↦→ Einbettung von LOPS durch Theoreme<br />
↦→ Strategien = Bestimmung der notwendigen Parameter<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 226 LOPS
LOPS: Sonstige Strategien<br />
• Allgemeine Techniken<br />
– Normalisierung <strong>und</strong> Simplifikation (gerichtete Lemmata)<br />
– Unterproblem-Erzeugung (für komplexere Ausdrücke)<br />
• Unterstützung von GUESS/DOMAIN<br />
– Preprocessing (Abspaltung von Outputs ohne darstellbare Anteile)<br />
– GET-RNV: Reduziere die Zahl der Ausgabevariablen<br />
– GET-SOC: Spalte Ausgabebedingungen<br />
– CHVAR: Wähle bestgeeigneteste Ausgabevariable<br />
– DEPEND: Bestimme Abhängigkeiten zwischen den Ausgabevariablen<br />
• Unterstützung von GET-REC<br />
– GET-EP: Ersetzung durch auswertbare Prädikate<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 227 LOPS
LOPS: Preprocessing für GUESS<br />
• Abspaltung von Eingaben, die kein GUESS erlauben<br />
– Ausgabewerte ohne darstellbare Anteile (d.h. ¬∃g:G.t(g,y))<br />
– zugehörige Eingaben haben einfache Lösungen (aus {y:R | ¬displayable(y)})<br />
• Bestimme Prädikat prim mit<br />
∀x:D. (∃y:R. I(x) ∧ O(x,y) ∧ ¬displayable(y)) ⇒ prim(x)<br />
∀x:D. I(x) ∧ prim(x) ⇒ ∃y:R. O(x,y)<br />
Herleitung: Vereinfachung von ∃y:R. I(x) ∧ O(x,y) ∧ ¬displayable(y)<br />
• Transformation: Zerlege<br />
∀x:D.∀y:R. I(x) ⇒ P(x,y) ⇔ O(x,y) in<br />
∀x:D.∀y:R. I(x) ∧ prim(x) ⇒ P(x,y) ⇔ O(x,y)<br />
∀x:D.∀y:R. I(x) ∧ ¬prim(x) ⇒ P(x,y) ⇔ O(x,y)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 228 LOPS
GET-RNV — Reduce Number of Output Variables<br />
• Anwendbar bei Programmen mit mehreren Ausgabewerten<br />
• Ziel: Veringere Anzahl der Ausgabevariablen<br />
– Suche unmittelbare Abhängigkeiten zwischen Variablen<br />
– Beschreibe Variable als Funktion der anderen<br />
• ∀x:D.∀(y,y’):R×R’. I(x) ⇒ P(x,(y,y’)) ⇔ O(x,(y,y’))<br />
wird transformiert in<br />
∀x:D.∀(y,y’):R×R’. I(x) ⇒ P(x,(y,y’)) ⇔ P’(x,y) ∧ y’=f(x,y)<br />
∀x:D.∀y:R. I(x) ⇒ P’(x,y) ⇔ O(x,y,f(x,y))<br />
Beispiel: Bestimme das i-t-größte Element einer Menge S<br />
∀S,i.∀S1,a,S2. i ∈ {1..|S|} ⇒ FIND((S,i),(S1,a,S2))<br />
⇔ S=S1∪{a}∪S2 ∧ ∀x ∈ S1.x
GET-SOC — Separate Output Conditions<br />
• Anwendbar bei Programmen mit mehreren Ausgabewerten<br />
– wenn GET-RNV nicht zum Ziel führt<br />
• Zerlege Output Bedingungen in unabhängige Teile<br />
∀x:D.∀(y,y’):R×R’. I(x) ⇒ P(x,(y,y’)) ⇔ O(x,(y,y’))<br />
wird transformiert in<br />
∀x:D.∀(y,y’):R×R’. I(x) ⇒ P(x,(y,y’)) ⇔ P 1<br />
(x,y) ∧<br />
∀x:D.∀(y,y’):R×R’. I(x) ⇒ P 1<br />
(x,y) ⇔ O 1<br />
(x,y)<br />
∀x:D.∀(y,y’):R×R’. I(x) ⇒ P 2<br />
(x,y) ⇔ O 2<br />
(x,y)<br />
• Zerlegung geschieht auf rein syntaktischer Basis<br />
– Aufsammeln von Konjunktionsgliedern, in denen nur y bzw. y’ vorkommt<br />
P 2<br />
(x,y’)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 230 LOPS
CHVAR — Choose Output-Variable<br />
• Anwendbar bei Programmen mit mehreren Ausgabewerten<br />
– ∀x:D.∀y,y’:R×R’. I(x) ⇒ P(x,(y,y’)) ⇔ O(x,(y,y’))<br />
– wenn GET-RNV <strong>und</strong> GET-SOC nicht zum Ziel führen<br />
• Versuche hierarchische Lösung:<br />
– Berechnung des zweiten Ausgabewertes wird Teilproblem bei Berechnung des ersten<br />
– Guessing zunächst auf ‘äußerer’ Variable<br />
– Guessing auf ‘innerer’ Variable während Synthese der entstandenen Teilprobleme<br />
• Lege heuristisch fest, welche Variable zuerst verwendet wird<br />
– Wähle Guess-Schema für einzelne Ausgabevariablen <strong>und</strong> führe DOMAIN aus<br />
– Vergleiche | {y:R | ∃g:G.DC(x,g) ∧ t(g,y)} |<br />
mit | {y’:R’ | ∃g’:G’.DC’(x,g’) ∧ t’(g’,y’)} |<br />
– Wähle Variable mit kleinerer Anzahl von Ratemöglichkeiten<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 231 LOPS
DEPEND — Bestimme Abhängigkeiten der Ausgaben<br />
• Anwendbar nach CHVAR<br />
– Bestimme Abhängigkeit der Ausgabevariablen von äußerster Guess-Variable (y)<br />
– ähnlich wie GET-RNV aber erheblich aufwendiger<br />
• Nach GUESS auf y suche maximale Bedingung O’(x,g,y,y’),<br />
die in beiden Teilproblemen lösbar ist<br />
– Heuristik: größte Menge von Konjunktionsgliedern, in denen y’ vorkommt<br />
• Synthetisiere separat (mit Eingabevariablen x,g,y!)<br />
∀x:D.∀g:G.∀y:R.∀y’:R’.<br />
I(x) ∧ DC(x,g) ⇒ P’(x,g,y,y’) ⇔ O’(x,y,y’)<br />
• Ersetze im ursprünglichen Problem y’ durch f’(x,g,y)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 232 LOPS
GET-EP — Rewrite into Evaluable Predicates<br />
• Simplifikation: ersetze Konjunktionsglieder der Ausgabeformel<br />
– suche Konjunktionsglieder, die nicht unmittelbar auswertbar sind<br />
– ersetze durch äquivalente auswertbare Prädikate<br />
• Ziel: vereinfachte Erzeugung von (<strong>Logik</strong>-)Programmen<br />
– vereinfachter Test auf Auswertbarkeit<br />
– effizientere Anordnung von Prädikaten im Programm<br />
• Hilfreich, aber nicht unbedingt notwendig<br />
Beispiel: Maximum-Simplifikation<br />
∀S:Set(Z).∀g,m:Z. S≠∅ ∧ g ∈ S ⇒<br />
max2(S,g,m) ⇔ m ∈ S ∧ ∀x ∈ S. x≤m ∧ g=m<br />
Ohne g=m ist ∀x ∈ S. x≤m nicht auswertbar. Ersetze durch ∀x ∈ S. x≤g<br />
∀S:Set(Z).∀g,m:Z. S≠∅ ∧ g ∈ S ⇒<br />
max2(S,g,m) ⇔ ∀x ∈ S. x≤g ∧ g=m<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 233 LOPS
LOPS: Gesamtstrategie (1)<br />
Gegeben x:D, y:R, I(x) <strong>und</strong> O(x,y)<br />
1. Definiere Prädikat P durch ∀x:D.∀y:R. I(x) ⇒ P(x,y) ⇔ O(x,y)<br />
– Markiere x als Eingabevariable<br />
2. GUESS-Phase:<br />
– Bei mehreren Ausgabevariablen versuche Problemreduktion mit GET-RNV,<br />
GET-SOC oder CHVAR/DEPEND<br />
(a) Wähle GUESS-Schema (R, G, displayable, t) aus der Wissensbank<br />
(b) Enthält R nichtdarstellbare Ausgaben, so spalte diese ab.<br />
(c) Bestimme DC mit der Heuristik DOMAIN<br />
(d) Transformiere die Ausgangsformel durch Hinzufügen der geratenen Information.<br />
(e) Spalte Problem in Teilprobleme <strong>und</strong> behandle diese einzeln.<br />
Markiere g als Eingabevariable der neuen Hilfsprädikate.<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 234 LOPS
LOPS: Gesamtstrategie (2)<br />
3. Teste Auswertbarkeit <strong>und</strong> Widersprüchlichkeit heuristisch<br />
– Heuristik: in wenigen Schritten nachweisbar<br />
– einfaches Guessing ↦→ trivial lösbare Teilprobleme<br />
– induktive Datenstrukturen ↦→ widersprüchliche Teilprobleme<br />
4. GET-REC-Phase<br />
(a) Wähle Rekursionsschema (D,R,↘) aus der Wissensbank.<br />
(b) Schreibe Formel um in rekursive Variante der Ausgangsformel:<br />
∀x:D.∀y:R.∀g:G. I base (x,g) ∨ I(x↘g) ⇒<br />
P’(x,g,y) ⇔ ∃y r .O(x↘g,y r ) ∧ O rec (x,g,y r ,y)<br />
(c) Spalte nichtrekursiven Lösungen (I base ) ab.<br />
Ersetze Konjunktionsglieder aus O durch P.<br />
5. Vereinfache Formeln soweit wie möglich <strong>und</strong> teste Auswertbarkeit<br />
– Starte LOPS erneut, wenn Formel nicht auswertbar<br />
6. Extrahiere aus der rekursiven Formel ein Programm<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 235 LOPS
LOPS Strategie: Sortieralgorithmus<br />
FUNCTION sort(L:Seq(Z)):Seq(Z) RETURNS S<br />
SUCH THAT rearranges(L,S) ∧ ordered(S)<br />
1. Definiere: ∀L,S:Seq(Z). true ⇒ SORT(L,S) ⇔ rearranges(L,S) ∧ ordered(S)<br />
2.(a) Wähle GUESS-Schema G ≡ Z, displayable(S) ≡ S≠[], t(g,S) ≡ g=first(S)<br />
(b) ∃S:Seq(Z). SORT(L,S) ∧ ¬(S≠[]) ⇒ L=[] ≡ prim(L)<br />
(c) ∃S:Seq(Z). L≠[] ∧ SORT(L,S) ∧ g=first(S) ⇒ g ∈ L ∧ ∀x ∈ L.x≥g<br />
Lösungsfunktion für DC(L,g): λL. min(L)<br />
(d) Teilprobleme:<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 236 LOPS<br />
B.2.26.1<br />
B.2: 9.3/26.3/26.12/ordered<br />
g ∈ L ∧ ∀x ∈ L.x≥g ⇒ SORT 1<br />
(L,g,S) ⇔ rearranges(L,S) ∧ ordered(S) ∧ g=first(S)<br />
g ∈ L ∧ ∀x ∈ L.x≥g ⇒ SORT 2<br />
(L,g,S) ⇔ rearranges(L,S) ∧ ordered(S) ∧ g≠first(S)<br />
3. Teilproblem SORT 2<br />
ist unerfüllbar<br />
4.(a) Rekursionsschema für Seq(Z)×Z: L↘g ≡ L-g<br />
(b) g ∈ L ∧ ∀x ∈ L.x≥g ⇒ SORT 1<br />
(L,g,S) ⇔ ∃S’:Seq(Z).SORT(L-g,S’) ∧ S=g.S’<br />
Funktion für Rekursionsanpassung: λL,g,S’. g.S’<br />
B.2: 26.15/3.2/2.3/25.2/fold SORT<br />
5. L = [] ⇒ SORT(L,S) ⇔ S=[] auswertbar<br />
L≠[] ⇒ SORT(L,S) ⇔ ∃g:Z. g ∈ L ∧ ∀x ∈ L.x≥g ∧ SORT 1<br />
(L,g,S) auswertbar<br />
g ∈ L ∧ ∀x ∈ L.x≥g ⇒ SORT 1<br />
(L,g,S) ⇔ ∃S’:Seq(Z).SORT(L-g,S’) ∧ S=g.S’ auswertbar<br />
6. Funktionale Lösung<br />
FUNCTION sort(L:Seq(Z)):Seq(Z) RETURNS S SUCH THAT rearranges(L,S) ∧ ordered(S)<br />
= if L=[] then [] else let g=min(L) in g.sort(L-g)
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 19<br />
Algorithmentheorien<br />
1. Übersicht<br />
2. Gr<strong>und</strong>konzepte<br />
3. Allgemeines Verfahren
Synthese mit Algorithmenschemata<br />
• Historisch: High-Level Transformation<br />
– Erzeuge lauffähigen Algorithmus in einem Schritt – Optimiere nachträglich<br />
• Vorarbeiten: Strukturanalyse für algorithmische Klasse<br />
– Identifizierung von Komponenten <strong>und</strong> Axiomen<br />
– Korrektheitsbeweis für abstraktes Algorithmenschema<br />
– Erstellung von konkreten (partiellen) Standardlösungsstrukturen<br />
+ Techniken zur Verfeinerung von Standardlösungen<br />
• Syntheseprozeß:<br />
– Bestimmung der fehlenden Komponenten<br />
– Nachweis der Axiome<br />
– Instantiierung des Algorithmenschemas<br />
• Forschung: Formalisierung als algebraische Theorien<br />
– 3 Ebenen: Allgemeines Konzept — algorithmische Theorien — konkrete Probleme<br />
– Entwurf spezialisierter Strategien für jede Algorithmenklasse<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 238 Algorithmentheorien
Algorithmenschemata: Literatur<br />
Douglas R. Smith and Michael R. Lowry<br />
Algorithm Theories and Design Tactics,<br />
Science of Computer Programming 14:305–321<br />
Douglas R. Smith<br />
KIDS — A Knowledge-Based Software Development system,<br />
in: Michael R. Lowry and Robert D. McCartney, ed.<br />
Automating Software Design, AAAI Press, 1991, p.483–514.<br />
Douglas R. Smith<br />
Top-Down Synthesis of Divide-and-Conquer Algorithms, AIJ 27:43–96, 1985<br />
Douglas R. Smith<br />
Structure and Design of Global Search Algorithms<br />
Structure and Design of Problem Reduction Generators<br />
Structure and Design of Dynamic Programming Algorithms<br />
Technical Report, Kestrel Institute<br />
Michael R. Lowry<br />
Structure and Design of Local Search Algorithms<br />
Proceedings, AAAI Workshop on Software Design, p.88–94<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 239 Algorithmentheorien
Algebraische Theorien – Gr<strong>und</strong>begriffe<br />
• Formale Theorie: Tripel T = (S, Ω, Ax)<br />
– S: Menge von Sortennamen (Namen für Datentypen)<br />
– Ω: Familie von Operationsnamen (zusammen mit Typisierung)<br />
– Ax: Menge von Axiomen für Datentypen <strong>und</strong> Operationen<br />
• Struktur für T :<br />
– Menge von Datentypen <strong>und</strong> Operationen, typisiert gemäß Ω<br />
• Modell für T :<br />
– Struktur T , die alle Axiome aus T erfüllt<br />
• Theorie T 1 erweitert T 2 :<br />
– Sortennamen, Operationsnamen <strong>und</strong> Axiome von T 2 existieren auch in T 1<br />
Struktur T 1 erweitert T 2 :<br />
– Datentypen <strong>und</strong> Operationen von T 2 existieren auch in T 1<br />
(gleiche Typisierung bezüglich T 2 !)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 240 Algorithmentheorien
Algorithmenschemata als algebraische Theorien<br />
• T SPEC : algebraische Theorie der Spezifikationen<br />
– ({D,R}, {I:D→B, O:D×R→B}, ∅)<br />
P Problemtheorie:<br />
– P erweitert T SPEC (P enthält Programmspezifikation)<br />
• T PROG : algebraische Theorie der Programme<br />
– ( {D,R}, {I: D→B, O: D×R→B, body: D↛R}, { ∀x:D. I(x) ⇒ O(x,body(x)) } )<br />
P Programmtheorie:<br />
– P erweitert T PROG<br />
• A Algorithmentheorie:<br />
– Problemtheorie mit kanonischer Erweiterung zu Programmtheorie<br />
– Es gibt abstraktes Programmschema BODY mit der Eigenschaft<br />
(spec A ,BODY(A)) korrekt für jedes Modell A von A<br />
“Für jedes Modell A existiert Standardlösung der Spezifikation spec A ”<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 241 Algorithmentheorien
Algorithmenschemata: Syntheseverfahren<br />
Satz: Spezifikation spec = (D,R,I,O) ist erfüllbar, wenn es eine Algorithmentheorie A<br />
<strong>und</strong> ein Modell A für A gibt, welches die Struktur Tspec = ({D,R}, {I,O}) erweitert<br />
Methode:<br />
– Wähle Algorithmentheorie A,<br />
– erweitere Tspec zu Modell A von A<br />
– Instantiiere BODY(A) <strong>und</strong> extrahiere Programmkomponenten<br />
Theorie-Erweiterung:<br />
Komponenten+Axiome<br />
✟ ✟✟✟✟✟✟✟✟✟✟✟✯<br />
T SPEC<br />
✟✟<br />
✟ ✟✟<br />
✟✟<br />
✟✟<br />
Tspec<br />
Spezifikation<br />
A<br />
A<br />
Modell<br />
Erweiterung:<br />
Komponentensuche<br />
Kanonische Theorie-Erweiterung: BODY + Korrektheitsaxiom<br />
Erweiterung mit BODY(A)<br />
Synthese<br />
T PROG<br />
✲<br />
✲<br />
✟ ✟✟✟✟✟✟✟✟✟✟✟✯<br />
✲<br />
✟✙<br />
✟<br />
✟✟<br />
✟✟<br />
✟✟<br />
✟✟<br />
Tprog<br />
Programm<br />
P<br />
P<br />
Programmkonstruktion:<br />
Extraktion relevanter Komponenten<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 242 Algorithmentheorien
Algorithmenschemata: Verfeinertes Syntheseverfahren<br />
spec reduzierbar auf spec ′ :<br />
– Eingabebedingung (nach Transformation) stärker, Ausgabebedingung schwächer<br />
– ∀x:D. I(x) ⇒ ∃x’:D’. I’(x) ∧ ∀y’:R’. O(x’,y’) ⇒ ∃y:R.O(x,y)<br />
Satz: spec = (D,R,I,O) ist erfüllbar, wenn es eine Algorithmentheorie<br />
A <strong>und</strong> ein Modell A für A gibt, so daß spec reduzierbar auf spec A<br />
⇓<br />
Methode: “Operator match”<br />
– Wähle Algorithmentheorie A <strong>und</strong> allgemeines Modell A von A<br />
– Zeige: spec reduzierbar auf spec A ↦−→ Substitutionen σ <strong>und</strong> θ<br />
– Spezialisiere body(A) zu λx. σ(x,body(A)(θ(x)))<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 243 Algorithmentheorien
Verfeinertes Syntheseverfahren für mengenwertige Probleme<br />
spec ′ generalisiert spec:<br />
– Eingabebedingung (nach Transformation) <strong>und</strong> Ausgabebedingung schwächer<br />
– ∀x:D. I(x) ⇒ ∃x’:D’. I’(x) ∧ ∀y:R. O(x,y) ⇒ O’(x’,y)<br />
Satz:<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS { z | O(x,z)}<br />
ist erfüllbar, wenn es eine Algorithmentheorie A <strong>und</strong> ein Modell<br />
A für A gibt, so daß gilt: spec A generalisiert (D,R,I,O)<br />
Methode:<br />
⇓<br />
– Wähle Algorithmentheorie A <strong>und</strong> allgemeines Modell A von A<br />
– Zeige: spec A generalisiert (D,R,I,O) ↦−→ Substitution θ:D→D A<br />
– Spezialisiere body(A) zu λx. { y | y ∈ body(A)(θ(x)) ∧ O(x,y) }<br />
(Optimierte Verfahren für spezielle Algorithmentheorien möglich)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 244 Algorithmentheorien
Algorithmenschemata: Vorteile für Syntheseverfahren<br />
1. Effizientes Syntheseverfahren<br />
– Theoretische Untersuchungen entlasten Syntheseprozeß zur Laufzeit<br />
↦→ Beweislast verlagert in Entwurf <strong>und</strong> Beweis der Algorithmentheorien<br />
– Verfeinerung vorgefertigter Teillösungen (Modelle) möglich<br />
↦→ zielgerichtetes Vorgehen, Verifikation der Axiome entfällt<br />
– Echte Kooperation zwischen Mensch <strong>und</strong> Computer<br />
Mensch: Entwurfsentscheidungen — Computer: formale Details<br />
2. Erzeugung effizienter Algorithmen<br />
– Vorgabe einer effizienten Gr<strong>und</strong>struktur durch Theoreme<br />
– Individuelle Optimierung nachträglich<br />
3. Wissensbasiertes Vorgehen<br />
– Erkenntnisse über Algorithmen als Theoreme verwendbar<br />
4. Formales theoretisches F<strong>und</strong>ament ↦→ leicht integrierbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 245 Algorithmentheorien
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 20<br />
Globalsuchalgorithmen<br />
1. Gr<strong>und</strong>form<br />
2. Filter<br />
3. Synthesestrategie<br />
4. Integration in formales Konzept
Globalsuch-Algorithmen: Suche alle Lösungen eines Problems<br />
Gr<strong>und</strong>struktur: Manipulation von Kandidatenmengen<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS { z | O(x,z)}<br />
= if Φ(x,s 0<br />
(x)) then F gs (x,s 0<br />
(x)) else ∅<br />
FUNCTION F gs (x,s:D×S):Set(R) WHERE I(x) ∧ J(x,s) ∧ Φ(x,s)<br />
RETURNS { z | O(x,z) ∧ sat(z,s)}<br />
= { z | z ∈ ext(s) ∧ O(x,z) } ∪ ⋃ { F gs (x,t) | t ∈ split(x,s) ∧ Φ(x,t) }<br />
• Deskriptoren s ∈ S für Kandidatenmengen<br />
J(x,s) : s sinnvoll für x — sat(z,s) : z gehört zur “Menge” s<br />
• Initialdeskriptor s 0<br />
(x) ∈ S – umfaßt alle Lösungen<br />
• Direkte Extraktion ext(s) ∈ Set(R) von Lösungskandidaten<br />
• Suche: rekursive Aufspaltung split(x,s) ∈ Set(S) von Deskriptoren<br />
• notwendige Filter Φ(x,s) – Elimination unnötiger Deskriptoren<br />
↦→ Verallgemeinerung von Binärsuche, Backtracking, . . .<br />
Vollständig: jede berechenbare Funktion beschreibbar<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 247 Globalsuchalgorithmen
Globalsuch-Algorithmen (Gr<strong>und</strong>form): Korrektheit<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS { z | O(x,z)} = F gs (x,s 0<br />
(x))<br />
FUNCTION F gs (x,s:D×S):Set(R) WHERE I(x) ∧ J(x,s) RETURNS { z | O(x,z) ∧ sat(z,s)}<br />
= { z | z ∈ ext(s) ∧ O(x,z) } ∪ ⋃ { F gs (x,t) | t ∈ split(x,s) }<br />
ist korrekt, wenn 5 Axiome erfüllt sind<br />
1. Initialdeskriptor ist sinnvoll<br />
– I(x) ⇒ J(x,s 0<br />
(x))<br />
2. Splitting sinnvoller Deskriptoren liefert sinnvolle Deskriptoren<br />
– I(x) ∧ J(x,s) ⇒ ∀t ∈ split(x,s). J(x,t)<br />
3. Initialdeskriptor enthält alle Lösungen<br />
– I(x) ∧ O(x,z) ⇒ sat(z,s 0<br />
(x))<br />
4. Alle Lösungen in endlich vielen Schritten extrahierbar<br />
– I(x) ∧ J(x,s) ∧ O(x,z) ⇒ sat(z,s) ⇔ ∃k:N.∃t ∈ split k (x,s). z ∈ ext(t)<br />
5. Splitting nur endlich oft durchführbar (Wohlf<strong>und</strong>iertheit)<br />
– I(x) ∧ J(x,s) ⇒ ∃k:N. split k (x,s) = ∅<br />
G=((D,R,I,O), S,J,s 0<br />
,sat,split,ext) wohlf<strong>und</strong>ierte Globalsuchtheorie<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 248 Globalsuchalgorithmen
Globalsuch-Algorithmen (Gr<strong>und</strong>form): Korrektheitsbeweis<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS { z | O(x,z)} = F gs (x,s 0<br />
(x))<br />
FUNCTION F gs (x,s:D×S):Set(R) WHERE I(x) ∧ J(x,s) RETURNS { z | O(x,z) ∧ sat(z,s)}<br />
= { z | z ∈ ext(s) ∧ O(x,z) } ∪ ⋃ { F gs (x,t) | t ∈ split(x,s) }<br />
• Korrektheit von F folgt aus Korrektheit von F gs mit Axiom 3 (& 1):<br />
I(x) ∧ J(x,s 0<br />
(x)) ⇒ { z | O(x,z) ∧ sat(z,s 0<br />
(x))} = { z | O(x,z) }<br />
• Partielle Korrektheit von F gs folgt aus Axiom 4 (& 2):<br />
Def.: split k (x,s) ≡ if k=0 then {s} else ⋃ {split k−1 (x,t) | t ∈ split(x,s)}<br />
Satz: Hält F gs (x,s) nach i Schritten an (split i (x,s) = ∅), so ist das Resultat<br />
⋃<br />
{ {z | z ∈ ext(t) ∧ O(x,z)} | t ∈<br />
⋃<br />
{split j (x,s) | j ∈ {0..i-1} } }<br />
(Lösungen, die extrahierbar sind aus Deskriptoren, die zu einem split j (x,s) mit j
Synthese von Globalsuch-Algorithmen: Hilfsmittel<br />
• Globalsuchtheorie G: allgemeine Suchstruktur für R<br />
– G=((D,R,I,O), S,J,s 0<br />
,sat,split,ext) erfüllt Axiome 1-4<br />
• Filter Φ: verfeinert split-Operation<br />
– split Φ (x,s) ≡ {t | t ∈split(x,s) ∧Φ(x,t)}<br />
vorgefertigt in Wissensbank<br />
Wohlf<strong>und</strong>iertheit: split Φ terminiert ( ˆ= Axiom 5)<br />
vorgefertigt in Wissensbank<br />
Notwendig: keine Lösung wird eliminiert (↦→ Axiom 4)<br />
– Φ(x,s) ⇐ ∃z:R. sat(z,s) ∧O(x,z) zur Laufzeit prüfen, heuristisch ergänzen<br />
Effizienzsteigerung durch starke notwendige Filter möglich<br />
• Spezialisierungsmechanismus für G <strong>und</strong> Φ<br />
– Wähle G passend zum Ausgabebereich der Spezifikation spec = (D,R,I,O)<br />
– Zeige: G generalisiert spec ↦−→ Substitution θ:D→D G<br />
– modifiziere G <strong>und</strong> Φ mit θ zu wohlf<strong>und</strong>ierter Globalsuchtheorie für spec<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 250 Globalsuchalgorithmen
GS-theorie: Folgen L von Elementen einer endlichen Menge S⊆α<br />
Suche ˆ= Aufzählung der Präfixe einer Folge<br />
• Deskriptormengen: Folgen mit gemeinsamem Präfix V<br />
• Splitting: Verlängern der Präfixsequenz<br />
• Extraktion: Gesamte Präfixsequenz<br />
gs seq set(α) ≡ D ↦→ Set(α)<br />
R ↦→ Seq(α)<br />
I ↦→ λS. true<br />
O ↦→ λS, L. range(L)⊆S<br />
S ↦→ Seq(α)<br />
J ↦→ λS, V. range(V)⊆S<br />
s 0<br />
↦→ λS. []<br />
sat ↦→ λL, V. V⊑L<br />
split ↦→ λS, V. {V·i|i ∈ S}<br />
ext ↦→ λV. {V}<br />
✁ . . . .<br />
x 1<br />
x 1<br />
... x 2<br />
x 1<br />
... x 3<br />
x 1<br />
... x 4 x 1<br />
...<br />
❅ ❆<br />
❅❆<br />
❅ ❆<br />
❅<br />
❅ ❆<br />
❅<br />
❅ ❆<br />
❅<br />
✁ . . .<br />
❅❆<br />
✁✁<br />
❅❆<br />
✁✁<br />
❅❆<br />
✁✁<br />
❅❆<br />
✁<br />
x 1<br />
x 2<br />
x 3<br />
x 4 x 5 ...<br />
❳ ❳❳❳❳ ❍<br />
❳<br />
❍ ❳❳❳ ❍<br />
❍<br />
❍❳<br />
✟✘✘ ✟✟✟✟ ✘ ✘✘✘ ✘<br />
[]<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 251 Globalsuchalgorithmen
Wohlf<strong>und</strong>iertheitsfilter für gs seq set(α)<br />
• Φ 1 (S,V) = |V|≤k<br />
– Längenbegrenzung absolut<br />
– Test einfach, Terminierung nach k Schritten, Baumgröße |S| k<br />
• Φ 2 (S,V) = |V|≤k*|S|<br />
– Längenbegrenzung relativ zur Größe von S<br />
– Test einfach, Terminierung nach k*|S| Schritten, Baumgröße |S| k∗|S|<br />
• Φ 3 (S,V) = nodups(V)<br />
– Folgen ohne doppelte Elemente<br />
– Test aufwendiger, Terminierung nach |S| Schritten, Baumgröße |S| !<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 252 Globalsuchalgorithmen
Spezialisierung von gs seq set(Z) <strong>und</strong> Φ 3<br />
Spezialisiere gs seq set(Z) <strong>und</strong> Φ 3 auf das Costas-Arrays Problem<br />
FUNCTION Costas (n:Z):Set(Seq(Z)) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
1. Ausgabebereich R stimmt mit R G =Seq(Z) überein<br />
2. Eingabebereiche D=Z <strong>und</strong> D G =Set(Z) sind anzupassen<br />
3. Keine Eingabebedingung zu prüfen, da I G (S)=true.<br />
4. Zeige ∀n:Z. n≥1 ⇒ ∃S:Set(Z). ∀p:Seq(Z). O(n,p) ⇒ range(p)⊆S<br />
– Heuristik: Suche Folgerungen von O(n,p), in denen range(p) vorkommt<br />
– Auffalten von perm liefert: perm(p,{1..n}) ⇒ range(p)⊆ {1..n}<br />
– Wähle S:={1..n}<br />
5. Modifiziere gs seq set(Z) <strong>und</strong> Φ 3 mit θ:=λn.{1..n} <strong>und</strong> (D,R,I,O)<br />
G θ<br />
= ((D,R,I,O),<br />
Seq(Z),λn,V.range(V)⊆{1..n},λn.[], sat,λn,V.{V·i|i ∈ {1..n}},ext)<br />
Φ 3,θ (n,V) = Φ 3 ({1..n},V) = nodups(V) notwendig für G θ !<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 253 Globalsuchalgorithmen
Globalsuchalgorithmen: allgemeine Synthesesestrategie<br />
Gegeben eine Problemspezifikation<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS {y:R | O(x,y)}<br />
1. Wähle Globalsuchtheorie G mit Ausgabetyp R (Wissensbank)<br />
2. Beweise ‘G generalisiert (D,R,I,O)’<br />
Extrahiere Substitution θ aus dem Beweis <strong>und</strong> berechne G θ<br />
3. Wähle wf-Filter Φ für G (Wissensbank)<br />
Beweise ‘Φ θ notwendig für G θ ’<br />
4. Bestimme zusätzlichen notwendigen Filter Ψ für G θ<br />
– Eigenschaften von x <strong>und</strong> s, die leicht aus sat(z,s) ∧ O(x,z) ableitbar sind<br />
5. Instantiiere schematischen Globalsuchalgorithmus für G Φ,θ,Ψ<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS { z | O(x,z)}<br />
= if Φ(θ(x),s 0<br />
(θ(x))) ∧ Ψ(x,s 0<br />
(θ(x))) then F gs (x,s 0<br />
(θ(x))) else ∅<br />
FUNCTION F gs (x,s:D×S):Set(R) WHERE I(x) ∧ J(x,s) ∧ Φ(θ(x),s) ∧ Ψ(x,s)<br />
RETURNS { z | O(x,z) ∧ sat(z,s)}<br />
= {z | z ∈ ext(s) ∧ O(x,z)} ∪ ⋃ {F gs (x,t) | t ∈ split(θ(x),s) ∧ Φ(θ(x),t) ∧ Ψ(x,t)}<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 254 Globalsuchalgorithmen
Globalsuchalgorithmen: Costas Arrays Synthese<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
1. Wähle die Globalsuchtheorie G = gs seq set(Z)<br />
2. Beweis für ‘G generalisiert (D,R,I,O)’ liefert θ(n) := {1..n}<br />
3. Wähle wf-Filter Φ so, daß ‘Φ θ notwendig für G θ ’ beweisbar<br />
perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) ∧ V⊑ p ⇒ Φ({1..n},V)<br />
Leicht beweisbar nur für Φ 3 (S,V) := nodups(V)<br />
4. Aus perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) ∧ V⊑p<br />
leite ab Ψ(n,V) := ∀i ∈ domain(V).nodups(dtrow(V,j))<br />
5. Instantiiere den Standard-Globalsuchalgorithmus<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= if nodups([]) ∧ ∀j ∈ domain([]).nodups(dtrow([],j)) then Costas gs (n,[]) else ∅<br />
FUNCTION Costas gs (n:Z,V:Seq(Z)):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= {p | p ∈ {V} ∧ perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
∪ ⋃ { Costas gs (n,W) | W ∈ {V·i|i ∈ {1..n}} ∧ nodups(W) ∧ ∀j ∈ domain(W).nodups(dtrow(W,j))}<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 255 Globalsuchalgorithmen
Globalsuch-Strategie: Integration in formales Konzept<br />
• Formalisiere Gr<strong>und</strong>konzepte als Definitionen<br />
– Globalsuchtheorie: Datenstruktur + Axiome<br />
– Generalisierungseigenschaft<br />
– Filter: Datenstruktur, Wohlf<strong>und</strong>iertheit, Notwendigkeit<br />
– Verfeinerung <strong>und</strong> Spezialisierung<br />
• Formalisiere vorgefertigte Objekte als Lemmata<br />
– konkrete Globalsuchtheorien (mit Nachweis der Axiome)<br />
– Wohlf<strong>und</strong>iertheitsfilter für existierende Globalsuchtheorien (mit Nachweis)<br />
• Beweise Theorem über Globalsuchalgorithmen<br />
– Erfüllbarkeit folgt aus Existenz von G, θ, Φ <strong>und</strong> Ψ sowie Axiomen<br />
• Schreibe Taktik zur Anwendung des Theorems<br />
– Matching, Instantiierung, Suche in der Wissensbank<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 256 Globalsuchalgorithmen
Globalsuch-Strategie: Formalisierung der Gr<strong>und</strong>konzepte<br />
GS ≡ spec:SPEC × S:TYPES × D×S→B × ...<br />
split k ≡ natind(k; λx,s.{s}; n,sp n<br />
. λx,s. ⋃ {sp n<br />
(x,t)|t ∈ split(x,s)})<br />
G is a GS-theory<br />
≡ let ((D,R,I,O), S, J, s 0<br />
, sat, split, ext) = G in<br />
∀x:D. I(x) ⇒ s 0<br />
(x) hält ∧ J(x,s 0<br />
(x))<br />
∧ ∀x:D.∀s:S. I(x) ∧ J(x,s) ⇒ ∀t ∈ split(x,s).J(x,t)<br />
∧ ∀x:D.∀z:R. I(x) ∧ O(x,z) ⇒ sat(z,s 0<br />
(x))<br />
∧ ∀x:D.∀s:S. I(x) ∧ J(x,s) ⇒ ∀z:R.O(x,z) ⇒<br />
sat(z,s) ⇔ ∃k:N.∃t ∈ split k (x,s). z ∈ ext(t)<br />
Filters(G) ≡ let..=G in D×S→B<br />
split Φ ≡ λx,s. { t | t ∈ split(x,s) ∧ Φ(x,t) }<br />
Φ necessary for G<br />
≡ let..=G in ∀x:D.∀s:S. ∃z:R. sat(z,s) ∧ O(x,z) ⇒ Φ(x,s)<br />
Φ wf-filter for G<br />
≡ let..=G in ∀x:D.∀s:S. I(x) ∧ J(x,s) ⇒ ∃k:N. split k Φ (x,s) = ∅<br />
G generalizes spec with θ<br />
≡ let..=G and (D’,R’,I’,O’)=spec in<br />
R’⊂R ∧ ∀x:D’. I’(x) ⇒ I(θ(x)) ∧ ∀z:R’. O’(x,z) ⇒ O(θ(x),z)<br />
Φ θ ≡ λx,s.Φ(θ(x),s)<br />
G θ (spec)<br />
≡ let..=G in ( spec, S, λx,s.J(θ(x),s), λx.s 0<br />
(θ(x)), sat, λx,s.split(θ(x),s), ext )<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 257 Globalsuchalgorithmen
Globalsuch-Strategie: Formalisierung als Theorem<br />
∀spec=(D,R,I,O):SPEC.<br />
FUNCTION F(x:D):Set(R) WHERE I(x) RETURNS {z | O(x,z)} ist erfüllbar<br />
⇐ ∃G:GS. G is a GS-Theory<br />
∧ ∃θ:D↛D G . G generalizes spec with θ<br />
∧ ∃Φ:Filters(G). Φ wf-filter for G ∧ Φ θ necessary for G θ (spec)<br />
∧ ∃Ψ:Filters(G θ (spec)). Ψ necessary for G θ (spec)<br />
Beweis:<br />
Gegeben: G = ((D’,R’,I’,O’), S, J, s 0<br />
, sat, split, ext), θ, Φ, <strong>und</strong> Ψ.<br />
Lösungsprogramm: Instantiierung des Standard-Globalsuchalgorithmus<br />
letrec f gs (x,s) = { z | z ∈ ext(s) ∧ O(x,z) }<br />
∪ ⋃ { f gs (x,t) | t ∈ split(θ(x),s) ∧ Φ(θ(x),t) ∧ Ψ(x,t) }<br />
in<br />
if Φ(θ(x),s0 (θ(x))) ∧ Ψ(x,s 0<br />
(θ(x))) then f gs (x,s 0<br />
(θ(x))) else ∅<br />
Korrektheit: Formalisierung des informalen Beweises mit NuPRL<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 258 Globalsuchalgorithmen
Globalsuch-Strategie: Synthese ˆ= Anwendung des Theorems<br />
1. Formuliere Syntheseproblem als Beweisziel<br />
⊢ FUNCTION F(x: D ):Set( R ) WHERE I(x) RETURNS {z | O(x,z) }<br />
ist erfüllbar<br />
2. Wende Synthesetheorem an wie eine Inferenzregel<br />
3. Als Unterziel bestimme G, θ, Φ <strong>und</strong> Ψ.<br />
(a) Wähle GS-theorie G aus Wissensbank (enthält 6-10 GS-theorien)<br />
mit Bildbereich R oder einer Obermenge davon<br />
(b) Bestimme Substitution θ<br />
Direkt oder Extraktion aus konstruktivem Beweis der Generalisierung<br />
(c) Wähle wf-filter Φ für G aus Wissensbank<br />
(3-4 Möglichkeiten)<br />
Zeige: Φ θ notwendig für G θ (spec)<br />
(d) Bestimme zusätzlichen Filter Ψ heuristisch<br />
Eigenschaften von x <strong>und</strong> s, die leicht aus sat(z,s) ∧ O(x,z) ableitbar sind<br />
⇒ ENDE: System extrahiert Instanz des Standard-Globalsuchalgorithmus<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 259 Globalsuchalgorithmen
Formale Costas Arrays Synthese: Zentraler Schritt<br />
# top<br />
⊢ FUNCTION Costas(n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j))}<br />
ist erfüllbar<br />
BY call ‘GS-theorem‘<br />
1. ⊢ ∃G. G is a GS-Theory<br />
∧ ∃θ. G generalizes spec with θ<br />
∧ ∃Φ. Φ wf-filter for G ∧ Φ θ necessary for G θ (spec)<br />
∧ ∃Ψ. Ψ necessary for G θ (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
Typinformation zugunsten der Lesbarkeit unterdrückt (Display-Mechanismus)<br />
Restliche Aufgabe: Bestimmung von G, θ, Φ <strong>und</strong> Ψ.<br />
– Extraktion des Algorithmus automatisch nach Lösung dieses Ziels<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 260 Globalsuchalgorithmen
Formale Costas Arrays Synthese: Wahl der GS-Theorie<br />
# top 1<br />
⊢ ∃G. G is a GS-Theory<br />
∧ ∃θ. G generalizes spec with θ<br />
∧ ∃Φ. Φ wf-filter for G ∧ Φ θ necessary for G θ (spec)<br />
∧ ∃Ψ. Ψ necessary for G θ (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
BY ex i gs seq set(Z) THEN unfold ‘perm‘<br />
1. ⊢ gs seq set(Z) is a GS-Theory<br />
2. ⊢ ∃θ. gs seq set(Z) generalizes spec with θ<br />
∧ ∃Φ. Φ wf-filter for gs seq set(Z)<br />
∧ Φ θ necessary for gs seq set(Z) θ (spec)<br />
∧ ∃Ψ. Ψ necessary for gs seq set(Z) θ (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
Teilziel 1 ˆ= Lemma der Wissensbank<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 261 Globalsuchalgorithmen
# top 1 2<br />
Formale Costas Arrays Synthese: Substitution θ<br />
⊢ ∃θ. gs seq set(Z) generalizes spec with θ<br />
∧ ∃Φ. Φ wf-filter for gs seq set(Z)<br />
∧ Φ θ necessary for gs seq set(Z) θ (spec)<br />
∧ ∃Ψ. Ψ necessary for gs seq set(Z) θ (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
BY ex i<br />
λn.{1..n}<br />
1. ⊢ gs seq set(Z) generalizes spec with λn.{1..n}<br />
where spec = ......<br />
2. ⊢ ∃Φ. Φ wf-filter for gs seq set(Z)<br />
∧ Φ θ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
∧ ∃Ψ. Ψ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ......<br />
Teilziel 1 lösbar durch einfachen Beweiser<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 262 Globalsuchalgorithmen
Formale Costas Arrays Synthese: Filter Φ<br />
# top 1 2 2<br />
⊢ ∃Φ. Φ wf-filter for gs seq set(Z)<br />
∧ Φ θ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
∧ ∃Ψ. Ψ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
BY ex i λS,V.nodups(V)<br />
1. ⊢ λS,V.nodups(V) wf-filter for gs seq set(Z)<br />
2. ⊢ λn,V.nodups(V) necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ......<br />
3. ⊢ ∃Ψ. Ψ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ......<br />
Teilziel 1 ˆ= Lemma der Wissensbank<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 263 Globalsuchalgorithmen
Formale Costas Arrays Synthese:Φ θ notwendig/Wahl von Ψ<br />
# top 1 2 2 2<br />
⊢ λn,V.nodups(V) necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ( Z, Seq(Z), λn. n≥1,<br />
λn,p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) )<br />
BY <strong>und</strong>o abstractions THEN unfold ‘specialize‘ THEN unfold ‘necessary‘<br />
1. ⊢ ∀n.∀V. ∃p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) ∧ V⊑p<br />
⇒ nodups(V)<br />
* BY Prover<br />
# top 1 2 2 3<br />
⊢ ∃Ψ. Ψ necessary for gs seq set(Z) λn.{1..n} (spec)<br />
where spec = ......<br />
(Prover zerlegt logisch <strong>und</strong> konsultiert dabei Fakten der Wissensbank)<br />
BY <strong>und</strong>o abstractions THEN unfold ‘specialize‘ THEN unfold ‘necessary‘<br />
1. ⊢ ∃Ψ.∀n.∀V. ∃p. nodups(p) ∧ range(p)={1..n} ∧ ∀j ∈ dom(p).nodups(dtrow(p,j)) ∧ V⊑p<br />
⇒ Ψ(n,V)<br />
* BY ex i λn,V. ∀j ∈ dom(V).nodups(dtrow(V,j) THEN Prover<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 264 Globalsuchalgorithmen
Costas Arrays: generiertes ausführbares Programm<br />
FUNCTION Costas(n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j))}<br />
is<br />
letrec Costas gs (n,V) =<br />
{ p | p ∈ {V} ∧ perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j))}<br />
∪ ⋃ { Costas gs (n,W) | W ∈ {V·i|i ∈ {1..n}} ∧ nodups(W)<br />
in<br />
if nodups([]) ∧ ∀j ∈ dom([]).nodups(dtrow([],j))<br />
then Costas gs (n,[]) else ∅<br />
∧ ∀j ∈ dom(W).nodups(dtrow(W,j)) }<br />
Nach elementaren Optimierungen<br />
(weitere sind möglich)<br />
FUNCTION Costas(n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ dom(p).nodups(dtrow(p,j))}<br />
is<br />
letrec Costasgs (n,V) =<br />
(if perm(V,{1..n}) ∧ ∀j ∈ dom(V).nodups(dtrow(V,j)) then {V} else ∅)<br />
∪ ⋃ { Costas gs (n,V·i) | i ∈ {1..n} ∧ nodups(V·i) ∧ ∀j ∈ dom(V·i).nodups(dtrow(V·i,j)) }<br />
in<br />
Costas gs (n,[])<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 265 Globalsuchalgorithmen
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 21<br />
Weitere Designstrategien<br />
1. Divide & Conquer Algorithmen<br />
2. Lokalsuch-Algorithmen<br />
3. Algorithmentaxonomie
Divide & Conquer Algorithmen<br />
Gr<strong>und</strong>struktur: Problemreduktion durch Dekomposition<br />
FUNCTION F(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
= if primitive(x) then Directly-solve(x)<br />
else (Compose ◦ G×F ◦ Decompose) (x)<br />
• Dekomposition Decompose(x) von Eingaben in Teilprobleme<br />
• Rekursiver Aufruf F(y) — Hilfsfunktion G(y’)<br />
– Zusammengesetzt zu G×F ≡ λy’,y.(G(y’),F(y))<br />
• Bottom-up Komposition Compose(z,z’) von Teillösungen<br />
– Notation: f◦g ≡ λx. f(g(x))<br />
• Direkte Lösung Directly-solve(x) für ‘primitive’ Teilprobleme<br />
• Kontrollprädikat primitive(x)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 267 Divide & Conquer Algorithmen
Divide & Conquer Algorithmen: Korrektheit<br />
FUNCTION F(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
= if primitive(x) then Directly-solve(x)<br />
else (Compose ◦ G×F ◦ Decompose) (x)<br />
ist korrekt, wenn 6 Axiome erfüllt sind<br />
1. Direkte Lösung Directly-solve(x) erfüllt O für primitive Eingaben<br />
– FUNCTION F p (x:D):R WHERE I(x) ∧ primitive(x) RETURNS y SUCH THAT O(x,y)<br />
2. ‘Strong Problem Reduction Principle’:<br />
– Ausgabebedingung O rekursiv zerlegbar in O D , O’ <strong>und</strong> O C<br />
O D (x,y’,y) ∧ O(y,z) ∧ O’(y’,z’) ∧ O C (z,z’,t) ⇒ O(x,t)<br />
3. Dekomposition Decompose(x) erfüllt O D <strong>und</strong> ‘verkleinert’ Problem<br />
– FUNCTION F d (x:D):D’×D WHERE I(x) ∧ ¬primitive(x)<br />
RETURNS y’,y SUCH THAT I’(y’) ∧ I(y) ∧ x≻y ∧ O D (x,y’,y)<br />
4. Komposition Compose(z,z’) erfüllt O C<br />
– FUNCTION F c (z,z’:R×R’):R RETURNS t SUCH THAT O C (z,z’,t)<br />
5. Hilfsfunktion G(y’) erfüllt O’<br />
– FUNCTION F G (y’:D’):R’ WHERE I’(y’) RETURNS z’ SUCH THAT O’(y’,z’)<br />
6. Verkleinerungsrelation ≻ ist wohlf<strong>und</strong>ierte Ordnung auf D<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 268 Divide & Conquer Algorithmen
Divide & Conquer Algorithmen: Korrektheitsbeweis<br />
FUNCTION F(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
= if primitive(x) then Directly-solve(x)<br />
else (Compose ◦ G×F ◦ Decompose) (x)<br />
• Partielle Korrektheit: strukturelle Induktion über (D,≻)<br />
– Primitive Eingaben:<br />
– F(x) = Directly-solve(x) — Korrektheit folgt aus Axiom 1<br />
– Nichtprimitive Eingaben:<br />
– F(x) = (Compose ◦ G×F ◦ Decompose) (x)<br />
– Decompose(x) liefert y’,y mit O D (x,y’,y) <strong>und</strong> x≻y Axiom 3<br />
– G(y’) liefert z’ mit O’(y’,z’) Axiom 5<br />
– F(y) liefert z mit O(y,z) Induktionsannahme<br />
– Compose(z,z’) liefert t mit O C (z,z’,t) Axiom 4<br />
– Für t gilt O(x,t) <strong>und</strong> es ist t=F(x) Axiom 2<br />
• Terminierung: Wohlf<strong>und</strong>iertheit von ≻ (Axiom 6)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 269 Divide & Conquer Algorithmen
Divide & Conquer Algorithmen: Synthesestrategie<br />
Zerlege Problem in Spezifikationen für Teilprobleme<br />
Gegeben:<br />
FUNCTION F(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
1. Wähle ≻ <strong>und</strong> Decompose aus Wissensbank ↦→ O D ,D’, Axiom 6<br />
2. Konstruiere Hilfsfunktion G: ↦→ O’,I’, Axiom 5<br />
– Heuristik: G:=F, falls D’=D, sonst G=Id<br />
3. Verifiziere Decompose, generiere Vorbedingung: ↦→ primitive, Axiom 3<br />
– Heuristik: abgeleitete zusätzliche Vorbedingung für O D ist ¬primitive(x)<br />
4. Konstruiere Compose ↦→ O C , Axiom 4,2<br />
– Heuristik: Erzeuge O C mit Axiom 2; synthetisiere Compose gemäß Axiom 4<br />
5. Konstruiere Directly-solve ↦→ Axiom 1<br />
– Heuristik: Suche nach vorgefertigten Lösungen, sonst neue Synthese<br />
– Falls dies nicht möglich ist, konstruiere eingeschränkte Vorbedingung I<br />
6. Instantiiere das Divide & Conquer Schema<br />
Alternativen:<br />
– Wähle Compose, konstruiere sukzessive G, ≻, Decompose <strong>und</strong> Directly-solve<br />
– Wähle Decompose <strong>und</strong> ≻, konstruiere sukzessive Compose, G <strong>und</strong> Directly-solve<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 270 Divide & Conquer Algorithmen
Divide & Conquer Strategie: Sortieralgorithmus<br />
FUNCTION sort(L:Seq(Z)):Seq(Z) RETURNS S<br />
SUCH THAT rearranges(L,S) ∧ ordered(S)<br />
1. L≻L’ : ≡ |L|>|L’|<br />
Decompose : ≡ ListSplit ≡ λL. ( [ L[i]|i ∈ [1..|L|÷2] ], [ L[i]|i ∈ [1+|L|÷2..|L|] ] )<br />
2. G : ≡ sort<br />
3. FUNCTION F d (L:Seq(Z):Seq(Z)×Seq(Z) WHERE ¬primitive(x)<br />
RETURNS L 1<br />
,L 2<br />
SUCH THAT L≻L 1<br />
∧ L≻L 2<br />
∧ L 1<br />
◦L 2<br />
=L ∧ |L 1<br />
|=|L|÷2 ∧ |L 2<br />
|=(1+|L|)÷2<br />
= ListSplit(L)<br />
hat als Vorbedingung für Korrektheit primitive(L) : ≡ L=[]<br />
4. L 1<br />
◦L 2<br />
=L ∧ ... ∧ SORT(L 1<br />
,S 1<br />
) ∧ SORT(L 2<br />
,S 2<br />
) ∧ O C (S 1<br />
,S 2<br />
,S) ⇒ SORT(L,S)<br />
liefert als Spezifikation <strong>und</strong> Lösung für Decompose<br />
FUNCTION F c (S 1<br />
,S 2<br />
:Seq(Z)×Seq(Z)):Seq(Z) WHERE ordered(S 1<br />
) ∧ ordered(S 2<br />
)<br />
RETURNS S SUCH THAT ordered(S) ∧ range(S)=range(S 1<br />
)∪range(S 2<br />
)<br />
= merge(S 1<br />
,S 2<br />
)<br />
5. Direkte Lösung für primitive Eingaben:<br />
FUNCTION F p (L:Seq(Z)):Seq(Z) WHERE |L|=[] RETURNS S<br />
6. Instantiierter Divide & Conquer Algorithmus<br />
SUCH THAT SORT(L,S) = L<br />
FUNCTION sort(L:Seq(Z)):Seq(Z) RETURNS S SUCH THAT rearranges(L,S) ∧ ordered(S)<br />
= if |L|=[] then L else let L 1<br />
,L 2<br />
= ListSplit(L) in merge(sort(L 1<br />
),sort(L 2<br />
))<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 271 Divide & Conquer Algorithmen
Lokalsuch-Algorithmen: Lösung von Optimierungsproblemen<br />
Gr<strong>und</strong>struktur: Suche lokales Optimum<br />
– Hillclimbing: Transformiere Initiallösung in benachbarte, verbesserte Lösung<br />
FUNCTION F opt (x:D):R WHERE I(x) RETURNS y<br />
SUCH THAT O(x,y) ∧ ∀t:R. O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
= F LS (x,F(x))<br />
FUNCTION F LS (x:D,z:R):R WHERE I(x) ∧ O(x,y) RETURNS y<br />
SUCH THAT O(x,y) ∧ ∀t ∈ N(x,y). O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
= if ∀t ∈ N(x,z). O(x,t) ⇒ cost(x,z)≤cost(x,t)<br />
then z<br />
else F LS (x, arb({t | t ∈ N(x,z) ∧ O(x,t) ∧ cost(x,z)>cost(x,t)}) )<br />
• Initiallösung F(x)<br />
• Nachbarschaftsstruktur N :D×R →Set(R)<br />
• Kostenfunktion cost auf Raum R mit Ordnung ≤<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 272 Lokalsuch-Algorithmen
Lokalsuch-Algorithmen: Korrektheit<br />
FUNCTION F opt (x:D):R WHERE I(x) RETURNS y<br />
SUCH THAT O(x,y) ∧ ∀t:R. O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
= F LS (x,F(x))<br />
FUNCTION F LS (x:D,z:R):R WHERE I(x) ∧ O(x,y) RETURNS y<br />
SUCH THAT O(x,y) ∧ ∀t ∈ N(x,y). O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
= if ∀t ∈ N(x,z). O(x,t) ⇒ cost(x,z)≤cost(x,t)<br />
then z else F LS (x, arb({t | t ∈ N(x,z) ∧ O(x,t) ∧ cost(x,z)>cost(x,t)}) )<br />
ist korrekt, wenn 4 Axiome erfüllt sind<br />
1. F(x) berechnet gültige Initiallösung für O<br />
– FUNCTION f(x:D):R WHERE I(x) RETURNS y SUCH THAT O(x,y)<br />
2. Reflexivität der Nachbarschaftsstruktur<br />
– ∀x:D.∀y:R. I(x) ∧ O(x,y) ⇒ y ∈ N(x,y)<br />
3. Exaktheit lokaler Optima<br />
– ∀x:D.∀y:R. I(x) ∧ O(x,y) ⇒ ∀t ∈ N(x,y). O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
⇒ ∀t:R. O(x,t) ⇒ cost(x,y)≤cost(x,t)<br />
4. Erreichbarkeit gültiger Lösungen<br />
– ∀x:D.∀y,t:R. I(x) ∧ O(x,y) ∧ O(x,t) ⇒ ∃k:N.t ∈ N k O (x,y)<br />
N k O (x,y) ≡ if k=0 then {y} else ⋃ { N k−1 (x,t) | t ∈ N(x,y) ∧ O(x,t) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 273 Lokalsuch-Algorithmen
Komplementierung<br />
Siebe<br />
statisch<br />
Problemreduktion<br />
(Operator Match)<br />
Hierarchie algorithmischer Theorien<br />
Allgemeine Problemstruktur<br />
Generate & Test<br />
<br />
<br />
<br />
<br />
<br />
Reduktionsstruktur<br />
✏ ✏✏✏✏✏✏✏✏✏✏✏✏✏✏✏ <br />
<br />
✘✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘<br />
✁<br />
✁<br />
✁<br />
✁<br />
✁<br />
∧ -Reduktion<br />
rekursiv<br />
❅ Divide & Conquer<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❅<br />
❳ ❳❳ ❳ ❳❳❳ ❳ ❳❳❳ ❳ ❳❳❳❳ ❳ ❳❳❳ ❳❳<br />
∨ -Reduktion<br />
<br />
<br />
statisch<br />
Bedingungen<br />
Fallanalyse<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟<br />
✟ ∧ - ∨ -Reduktion<br />
Dynamische <strong>Programmierung</strong><br />
Branch & Bo<strong>und</strong> (AO ∗ )<br />
Spielbaum-Suche<br />
Lokale Struktur<br />
Lokalsuche<br />
Simulated Annealing<br />
rekursiv<br />
✟<br />
✟<br />
✟<br />
✟<br />
Globalsuche<br />
Binärsuche<br />
Backtracking<br />
Branch & Bo<strong>und</strong> (A ∗ )<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 274 Algorithmentheorien
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 22<br />
Optimierungstechniken<br />
1. Simplifikationen<br />
2. Partielle Auswertung<br />
3. Endliche Differenzierung<br />
4. Fallanalyse<br />
5. Datentyp-Verfeinerung
Optimierungstechniken<br />
• Simplifikationen<br />
– unabhängig (nur Teilausdruck betrachtet)<br />
– mit Kontextberücksichtigung<br />
• Partielle Auswertung<br />
– Auswertung von Funktionen mit konstanten Argumenten<br />
• Endliche Differenzierung<br />
– Inkrementelle Berechnung von Teilausdrücken<br />
• Fallanalyse<br />
• Datentyp-Verfeinerung<br />
– Auswahl konkrete Implementierungen für abstrakte Konstrukte<br />
• Complierung<br />
– Übersetzung in konkrete Zielsprache + sprachabhängige Optimierung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 276 Optimierungstechniken
Simplifikationen<br />
Logische Vereinfachung von Teilausdrücken<br />
Anwendung gerichteter Gleichungen (Lemmata)<br />
• CI-Simplifikation: (kontextunabhängig)<br />
– Anwendung von Gleichungen ohne Vorbedingungen<br />
– Ausführung, solange anwendbare Gleichungen vorhanden<br />
• CD-Simplifikation: (kontextabhängig)<br />
– Anwendung bedingter Gleichungen<br />
– Kontext wird über Syntaxbaum bestimmt (Programmcode <strong>und</strong> Vorbedingung)<br />
– Hauptanwendung: Elimination red<strong>und</strong>anter Teilausdrücke<br />
Benutzer wählt konkreten Teilausdruck <strong>und</strong> Art der<br />
Vereinfachung<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 277 Optimierungstechniken
Costas-Arrays Optimierung: erster Algorithmus<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= if nodups([]) ∧ ∀j ∈ domain([]).nodups(dtrow([],j))<br />
then Costas aux (n,[]) else ∅<br />
FUNCTION Costas aux (n:Z,V:Seq(Z)):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= {p | p ∈ {V} ∧ perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
∪ ⋃ { Costas aux (n,W) | W ∈ {V·i|i ∈ {1..n}} ∧ nodups(W)<br />
∧ ∀j ∈ domain(W).nodups(dtrow(W,j)) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 278 Optimierungstechniken
Costas-Arrays Optimierung: CI-Simplifikationen<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= Costas aux (n,[])<br />
FUNCTION Costas aux (n:Z,V:Seq(Z)):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if perm(V,{1..n}) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j)) then {V} else ∅)<br />
∪ ⋃ { Costas aux (n,V·i) |i ∈ {1..n} ∧ nodups(V·i)<br />
∧ ∀j ∈ domain(V·i).nodups(dtrow(V·i,j)) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 279 Optimierungstechniken
Costas-Arrays Optimierung: CD-Simplifikationen<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= Costas aux (n,[])<br />
FUNCTION Costas aux (n:Z,V:Seq(Z)):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if {1..n}⊆range(V) then {V} else ∅)<br />
∪ ⋃ { Costas aux (n,V·i) | i ∈ {1..n} ∧ i ∉ V<br />
∧ ∀j ∈ domain(V). (V[|V|+1-j]-i) ∉ dtrow(V,j) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 280 Optimierungstechniken
Partielle Auswertung<br />
Auswertung von Funktionen mit konstantem Argument<br />
• Formal: Auffalten von Definitionen + Simplifikation<br />
– solange ein konstanter Teilausdruck vorhanden<br />
Beispiel:<br />
|[4;5] ◦ V| unfold concatenation<br />
= |4. ([5] ◦ V)| unfold concatenation<br />
= |4. (5. ([] ◦ V))| unfold concatenation<br />
= |4. (5. V)| unfold length<br />
= 1 + |5. V| unfold length<br />
= 1 + 1 + |V| simplify<br />
= 2 + |V|<br />
• Benutzer wählt auszuwertenden Teilausdruck<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 281 Optimierungstechniken
Endliche Differenzierung<br />
Inkrementelle Berechnung wiederkehrender Teilausdrücke<br />
• Ersetze Teilausdrücke in rekursiven Aufrufen durch<br />
Variablen <strong>und</strong> bestimme differentielle Veränderungen<br />
Formal: Abstraktion über Teilausdruck E(x)<br />
+ Simplifikation mit zusätzlicher Gleichung<br />
• Abstraktion über E(x) in f(x):<br />
– Bestimme neues f’, so daß f(x) = f’(x,E(x))<br />
– Ersetze alle Aufrufe der Art f( g(x) ) durch f’( g(x) x, E(g(x)) )<br />
• Simplifikation mit zusätzlicher Gleichung ‘E(x) = new’<br />
– Simplifiziere Ausdrücke der Form E(g(x)) in die Form g’(E(x))<br />
– Ersetze alle Vorkommen von E(x) durch new<br />
• Benutzer wählt konkreten Teilausdruck E(x)<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 282 Optimierungstechniken
Costas-Arrays Optimierung: Endliche Differenzierung<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= Costas aux1 (n,[],{1..n})<br />
FUNCTION Costas aux1 (n:Z,V:Seq(Z),Pool:Set(Z)):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
∧ Pool = {1..n}\range(V)<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= (if empty?(Pool) then {V} else ∅)<br />
∪ ⋃ { Costas aux1 (n,V·i,Pool−i) |i ∈ Pool<br />
∧ ∀j ∈ domain(V). (V[ |V|+1 -j]-i) ∉ dtrow(V,j) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 283 Optimierungstechniken
Costas-Arrays Optimierung: Fallanalyse<br />
FUNCTION Costas (n:Z):Set( Seq(Z) ) WHERE n≥1<br />
RETURNS {p | perm(p,{1..n}) ∧ ∀j ∈ domain(p).nodups(dtrow(p,j))}<br />
= Costas aux2 (n,[],{1..n},1)<br />
FUNCTION Costas aux2 (n:Z,V:Seq(Z), Pool:Set(Z),Vsize:Z):Set( Seq(Z) )<br />
WHERE n≥1 ∧ range(V)⊆{1..n} ∧ nodups(V) ∧ ∀j ∈ domain(V).nodups(dtrow(V,j))<br />
∧ Pool = {1..n}\range(V) ∧ Vsize = |V|+1<br />
RETURNS {p | perm(p,{1..n}) ∧ V⊑p ∧ ∀j ∈ domain(p).nodups(dtrow(p,j)) }<br />
= if empty?(Pool)<br />
then {V}<br />
else ⋃ { Costas aux2 (n,V·i,Pool−i,Vsize+1) |i ∈ Pool<br />
∧ ∀j ∈ domain(V). (V[Vsize-j]-i) ∉ dtrow(V,j) }<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 284 Optimierungstechniken
Datentypverfeinerung<br />
Ersetze abstrakte Definitionen von Datentypen<br />
durch effiziente konkrete Implementierungen<br />
• Endliche Mengen<br />
– Listen: Standardimplementierung<br />
– Bitvektor: Mengen über endlichem Domain<br />
– charakteristische Funktion (effiziente Elementrelation)<br />
• Folgen<br />
– verkettete Liste: Standardimplementierung<br />
– umgekehrte Liste (gut für append-Operation ·)<br />
• System stellt Auswahl von Implementierungen bereit<br />
Benutzer legt Nichtstandard-Implementierung fest<br />
– separat für jede einzelne Variable<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 285 Optimierungstechniken
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong><br />
Lektion 23<br />
Ausblick
Programmsynthese:<br />
Ausblick<br />
• Notwendig für die Praxis der <strong>Programmierung</strong><br />
• Marktreife noch in weiter Zukunft<br />
• Zukunftsträchtiges Forschungsgebiet<br />
• Bedingungen an konkrete Systeme<br />
– interne Verarbeitung formal korrekt<br />
– externe Präsentation möglichst wenig formal<br />
– graphische Unterstützung für Kontrolle einer Synthese<br />
– große Wissensbanken mit effizienter Verwaltung<br />
• Voraussetzungen für die Entwicklung von Systemen<br />
– Theoretische Gr<strong>und</strong>lagen <strong>und</strong> praktische Programmierarbeiten<br />
– Formale Denkweise, Kenntnis logischer Kalküle, Abstraktionsvermögen<br />
– Kreativität, Experimentierfreudigkeit, Ausdauer<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 287 Ausblick
Aktuelle Forschungsthemen<br />
• Aufbau <strong>und</strong> Strukturierung der Wissensbank<br />
– Formalisierung <strong>und</strong> Computerrealisierung verschiedener Anwendungsbereiche<br />
– Anwendung von Lemmata als Rewrite-Regeln (Teilterm-matching 2. Stufe)<br />
– Effizienter Zugriff auf anwendbare Lemmata (Strukturierungsmethoden)<br />
• Integration von Beweisverfahren<br />
– Aussagenlogik – Entscheidungsprozeduren (Davis-Putnam Verfahren?)<br />
– Prädikatenlogik – Konnektionsmethode (↦→ S.Schmitt / J.Otten / D.Korn)<br />
– Induktionstechniken (Rippling,...)<br />
– Anwendungsspezifische Verfahren<br />
• Integration von Syntheseverfahren<br />
– Computerrealisierung von Algorithmetheorien als Theoreme<br />
– Spezialisierte Entwurfstaktiken mit Theoremeinbindung<br />
– Optimierungstechniken<br />
• Benutzerinterface & Dokumentation<br />
↦→ Studien- & Diplomarbeiten<br />
<strong>Automatisierte</strong> <strong>Logik</strong> <strong>und</strong> <strong>Programmierung</strong> 288 Ausblick