kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

ゲーデルの不完全性定理の証明のアレをRacketで書いてみる (58)

大詰め

定義43 xはaとbの"直接の帰結"である

(define (IsConseq [x : GForm]
                  [a : GForm]
                  [b : GForm]) : Boolean
  (or (= a (Implies b x))
      (∃ v <= x (and (IsVar (gsymbol+ v))
                     (= x (ForAll (gsymbol+ v) a))))))

定義44 xは"形式的証明"である

(define (IsAxiomAt [x : GSeqSeq]
                   [n : Natural]) : Boolean
  (IsAxiom (gform+ (elm x n))))

(define (ConseqAt [x : GProof]
                  [n : Natural]) : Boolean
  (∃ p q < n
     (and (> p 0)
          (> q 0)
          (IsConseq (gform+ (elm x n))
                    (gform+ (elm x p))
                    (gform+ (elm x q))))))

(define (IsProof [x : GProof])
  (and (> (len x) 0)
       (∀ n <= (len x)
          (⇒ (> n 0)
             (or (IsAxiomAt x n)
                 (ConseqAt x n))))))

定義45 pはxの"形式的証明"である

(define (Proves [p : GProof]
                [x : GForm])
  (and (IsProof p)
       (IsEndedWith p x)))

ラスボスを倒すには特別な装備が必要
(上限なしの)

(define-syntax (define-equipment stx)
  (syntax-parse stx
    ((_ name term notfound found)
     #:with fname (format-id stx "_~a" #'name)
     #'(begin
         (define (fname [cmp : (-> Natural Natural Boolean)]
                        [max : Natural]
                        [f : (-> Natural Boolean)]) : Boolean
           (let loop ((x : Natural 0))
             (cond ((not (cmp x max)) (notfound x))
                   ((term (f x)) (found x))
                   (else (loop (+ x 1))))))
         (define-syntax (name stx)
           (syntax-parse stx
             [(_ v:id cmp:id max:expr body:expr)
              #'(fname cmp max (λ (v) body))]
             [(_ v:id ...+ vn:id cmp max:expr body:expr)
              #'(name v (... ...) cmp max (fname cmp max (λ (vn) body)))]
             [(_ v:id body:expr)
              #'(fname (const #t) 0 (λ (v) body))]
             [(_ v:id ...+ vn:id body:expr)
              #'(name v (... ...)
                      (const #t)
                      0
                      (fname (const #t) 0 (λ (vn) body)))]))))))

かなり適当なパターンマッチでギリギリたまたま動いてるって感じ

定義46 xには、"形式的証明"が存在する

(define (IsProvable [x : GForm])
  (∃ p (Proves (gproof+ p) x)))

終わり!
(終わったからといって特に何もなし)
(定理証明手習いにとりかかれる)