;;; Vikalpa --- Proof Assistant ;;; Copyright © 2020 Masaya Tojo ;;; ;;; This file is part of Vikalpa. ;;; ;;; Vikalpa is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; Vikalpa is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Vikalpa. If not, see . (define-module (vikalpa prelude) #:export (prelude) #:use-module (vikalpa)) (define-syntax-rule (define-proof/is name p t1 t2) (define-proof name (((2) if-same (set x (p x))) ((2 2 1) t1) ((2 2) equal-same) ((2) t2) (() if-same)))) (define-system prelude/macros () (define-syntax-rules and () ((and) '#t) ((and x) x) ((and x . xs) (if x (and . xs) #f))) (define-syntax-rules or () ((or) '#f) ((or x) x) ((or x . xs) (if x x (or . xs)))) (define-syntax-rules cond (else) ((cond (else e)) e) ((cond (test then) . rest) (if test then (cond . rest)))) (define-syntax-rules implies () ((implies x y) (if x y #t)) ((implies x y z . rest) (if x (implies y z . rest) #t)))) (define-system prelude/equal (prelude/macros) (define-axiom equal-same (x) (equal? (equal? x x) '#t)) (define-axiom equal-swap (x y) (equal? (equal? x y) (equal? y x))) (define-axiom equal-if (x y) (implies (equal? x y) (equal? x y)))) (define-system prelude/if (prelude/equal) (define-axiom if-nest (x y z) (if x (equal? (if x y z) y) (equal? (if x y z) z))) (define-axiom if-true (x y) (equal? (if '#t x y) x)) (define-axiom if-false (x y) (equal? (if '#f x y) y)) (define-axiom if-same (x y) (equal? (if x y y) y)) (define-axiom if-not (x y z) (equal? (if (not x) y z) (if x z y)))) (define-system prelude/number (prelude/if) (define-core-function number? (x) number?) (define-core-function rational? (x) rational?) (define-core-function integer? (x) integer?) (define-function zero? (x) (equal? x 0)) (define-core-function < (x y) (lambda (x y) (if (rational? x) (if (rational? y) (< x y) (< x 0)) (if (rational? y) (< 0 y) #f)))) (define-axiom axiom-< (x y) (if (rational? x) (if (rational? y) #t (equal? (< x y) (< x 0))) (if (rational? y) (equal? (< x y) (< 0 y)) (equal? (< x y) #f)))) (define-function natural? (x) (if (integer? x) (if (zero? x) #t (< 0 x)) #f)) (define-axiom rational-is-number (x y z) (implies (rational? x) (equal? (if (number? x) y z) y))) (define-axiom integer-is-rational (x y z) (implies (integer? x) (equal? (if (rational? x) y z) y))) (define-theorem integer-is-number (x y z) (implies (integer? x) (equal? (if (number? x) y z) y))) (define-theorem natural-is-integer (x y z) (implies (natural? x) (equal? (if (integer? x) y z) y))) (define-theorem natural-is-rational (x y z) (implies (natural? x) (equal? (if (rational? x) y z) y))) (define-theorem natural-is-number (x y z) (implies (natural? x) (equal? (if (number? x) y z) y))) (define-core-function + (x y) (lambda (x y) (if (number? x) (if (number? y) (+ x y) (+ x 0)) (if (number? y) (+ 0 y) 0))))) (define-system prelude/measure (prelude/number) (set-measure-predicate natural?) (set-measure-less-than <)) (define-system prelude/pair (prelude/measure) (define-core-function pair? (x) pair?) (define-core-function cons (x y) cons) (define-core-function car (x) (lambda (x) (if (pair? x) (car x) '()))) (define-core-function cdr (x) (lambda (x) (if (pair? x) (cdr x) '())))) (define-system prelude/tree (prelude/pair) (define-trivial-total-function size (x) (if (pair? x) (+ 1 (+ (size (car x)) (size (cdr x)))) 0)) (define-axiom natural/size (x) (equal? (natural? (size x)) #t)) (define-axiom size/car (x) (equal? (< (size (car x)) (size x)) #t)) (define-axiom size/cdr (x) (equal? (< (size (cdr x)) (size x)) #t)) (define-function tree-induction (x) (if (not (pair? x)) x (cons (tree-induction (car x)) (tree-induction (cdr x)))))) (define-system prelude/proofs (prelude/tree) (define-proof/is integer-is-number rational? rational-is-number integer-is-rational) (define-proof natural-is-integer ((() if-same (set x (integer? x))) ((2 2 1) if-nest) ((2 2) equal-same) ((2) if-same) ((3 1) natural?) ((3 1) if-nest) ((3) if-false) (() if-same))) (define-proof/is natural-is-rational integer? integer-is-rational natural-is-integer) (define-proof/is natural-is-number rational? rational-is-number natural-is-rational) (define-proof tree-induction (size x) (((2 3 1) size/car) ((2 3 2) size/cdr) ((2 3) if-true) ((2) if-same) ((1) natural/size) (() if-true)))) (define-system prelude (prelude/proofs))