19.11.2013 Aufrufe

Automatisierte Logik und Programmierung

Automatisierte Logik und Programmierung

Automatisierte Logik und Programmierung

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!