;; natplus.scm einladen (Pfad falls nötig anpassen) (set! COMMENT-FLAG #f) (load "./natplus.scm") (set! COMMENT-FLAG #t) ; In natplus.scm wird der einfache Typ Nat definiert, welcher den natürlichen Zahlen entspricht und durch die Kunstruktoren ; 0 : ℕ ; Succ : ℕ → ℕ ; aufgebaut wird. Succ 0 stellt also bspw. die Eins und Succ (Succ 0) die 2 dar. (pp (pt "Succ 0")) (pp (pt "Succ (Succ 0)")) (pp (pt "2")) ; Wir können Succ (Succ 0) direkt als 2 notieren ; Weiter werden zahlreiche Operationen auf Nat definiert. Uns interessieren hier nur NatPlus und =. ; NatPlus wird durch + notiert und entspricht natürlich der Addition. NatPlus hat die Rechenregeln ; alln n + 0 eqd n : NatPlus0CompRule ; alln,m n + Succ m eqd Succ (n + m) : NatPlus1CompRule ; Hier bedeuted eqd, dass die linke Seite per Definition der rechten Seite entspricht. NatPlus (also +) ist so definiert, sodass für alle n, die Aussage n+0 zu n reduziert. (pp "NatPlus0CompRule") ; Ihr könnte die ^ zunächst ignorieren (pp "NatPlus1CompRule") (pp (pt "2+1")) (pp (pt "NatPlus 2 1")) ; Wir können auch NatPlus schreiben ; Zuletzt haben wir noch =. = ist die entscheidbare Gleichheit auf den natürlichen Zahlen ℕ. Gegeben zwei Zahlen berechnet = also ob die Zahlen äquivalent sind und gibt den entsprechenden Wahrheitswert zurück. Es gilt also das 2=1 gleich F (Falsch) und 1=1 gleich T (Wahr) ist. ;; Für die Aufgaben nötige Befehle ;; (assume …) ; Siehe vorherige Aufgaben ;; (use …) ; Siehe vorherige Aufgaben ;; (ind) ; Wenn das Ziel die Form ∀ₙA(n) hat, dann beginnt (ind) einen Induktionsbeweis über n an. D.h. (ind) erstellt zwei neue Ziele, den Induktionsanfang A(0) und den Induktionsschritt ∀ₙ(A(n) → A(n+1)). ;; (simp …) ; Simp akzeptiert den Namen eines Theorems oder einer Variable, welche eine Gleichheit (D.h. die entsprechende Formel sollte von der Form "… eqd …" oder " … = …" sein) ausdrückt und wendet diese Gleichheit auf das Ziel an. ;; Als einfaches Beispiel für simp und die Verwendung von NatPlus0CompRule zeigen wir: (set-goal "1+2=3") (simp "NatPlus1CompRule") ; Wir können die Regel auch rückwärts anwenden: (simp "<-" "NatPlus1CompRule") ; Zurück zum Beweis: (simp "NatPlus1CompRule") (simp "NatPlus1CompRule") (simp "NatPlus0CompRule") ; Da der Term berechenbar wahr ist, können wir folgendes verwenden: (use "Truth") ; Wie auch in ueb00.scm erwähnt, können wir Theoreme speichern und später mit simp oder use verwenden. (save "OnePlusTwoEqualsThree") ; Da "1+2=3" berechenbar wahr ist, können wir auch direkt (use "Truth") verwenden: (set-goal "1+2=3") (use "Truth") ;; Zuletzt ist noch der Befehl (pp) zu empfehlen. Mit diesem können insbesondere die Aussagen von Theoremen bestimmt werden: (pp "OnePlusTwoEqualsThree") (set-goal "all n 0+n=n") (ind) ; In dieser Aufgabe sind nur die folgenden Befehle nötig: ; (assume …) ; (simp …) ; (use "Truth") ;; IA ; … ;; IS ; … (save "NatZeroPlus") (set-goal "all n,m Succ m+n=Succ(m+n)") ; … (save "NatSuccPlus") (set-goal "all n,m,l n+(m+l)=n+m+l") ; … (save "NatPlusAssoc") (set-goal "all n,m n+m=m+n") ; … (save "NatPlusComm")