summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasaya Tojo <masaya@tojo.tokyo>2020-11-30 14:13:52 +0900
committerMasaya Tojo <masaya@tojo.tokyo>2020-11-30 14:13:52 +0900
commit107ff1ce2460045e30961dd5679c9e20ec1d57a9 (patch)
treedb9a601ae3e7901d8266b340d168318843eba328
parent7955016f0c6908c9d2e0578d75d4b2104f97e0a2 (diff)
wip42
-rw-r--r--vikalpa.scm84
-rw-r--r--vikalpa/prelude.scm14
2 files changed, 62 insertions, 36 deletions
diff --git a/vikalpa.scm b/vikalpa.scm
index 98a7d97..a2b4dd2 100644
--- a/vikalpa.scm
+++ b/vikalpa.scm
@@ -1040,7 +1040,8 @@
(syntax-rules ()
((_ name (var ...) expr)
(let ((t (axiom 'name '(var ...)
- (convert-to-expression 'expr))))
+ (make-theorem-claim (convert-to-expression 'expr)
+ (current-system)))))
(add-definition t)
(validate-definition t)
t))))
@@ -1049,7 +1050,8 @@
(syntax-rules ()
((_ name (var ...) expr)
(let ((t (theorem 'name '(var ...)
- (convert-to-expression 'expr))))
+ (make-theorem-claim (convert-to-expression 'expr)
+ (current-system)))))
(add-definition t)
(validate-definition t)
t))))
@@ -1170,14 +1172,15 @@
(fail 'cdr extracted-expr))))
((integer?)
(match extracted-expr
- (('integer? `(quote ,x))
- (expr-quote (integer? x)))
+ (('natural? `(quote ,x))
+ (expr-quote (natural? x)))
(else
- (fail 'integer? extracted-expr))))
+ (fail 'natural? extracted-expr))))
((succ)
(match extracted-expr
(('succ `(quote ,x))
- (if (integer? x)
+ (if (and (natural? x)
+ (< 0 x))
(expr-quote (succ x))
''undefined))
(else
@@ -1185,7 +1188,7 @@
((pred)
(match extracted-expr
(('pred `(quote ,x))
- (if (integer? x)
+ (if (natural? x)
(expr-quote (pred x))
''undefined))
(else
@@ -1193,7 +1196,7 @@
((<)
(match extracted-expr
(('< `(quote ,x) `(quote ,y))
- (if (and (integer? x) (integer? y))
+ (if (and (natural? x) (natural? y))
(expr-quote (< x y))
''undefined))
(else
@@ -1206,20 +1209,12 @@
(define-core-function equal? (x y))
(define-core-function pair? (x y))
(define-core-function cons (x y))
- (define-core-function car (x)
- #;(pair? x)
- )
- (define-core-function cdr (x)
- #;(pair? x)
- )
- (define-core-function integer? (x))
- (define-core-function < (x y)
- ;;(integer? x) (integer? y)
- )
- (define-core-function succ (x) ;;(integer? x)
- )
- (define-core-function pred (x) ;;(integer? x)
- )
+ (define-core-function car (x) (pair? x))
+ (define-core-function cdr (x) (pair? x))
+ (define-core-function natural? (x))
+ (define-core-function < (x y) (natural? x) (natural? y))
+ (define-core-function succ (x) (natural? x))
+ (define-core-function pred (x) (natural? x))
(current-system)))
(define-syntax define-system
@@ -1371,6 +1366,51 @@
'#t
'#f))
+(define (make-theorem-claim expr sys)
+ (define (find-preconds expr)
+ (cond
+ ((app-form? expr)
+ (let ((rest (append-map find-preconds (cdr expr))))
+ (append (cond ((lookup (car expr) sys) =>
+ (lambda (f)
+ (let ((preconds (function-preconds f)))
+ (map (lambda (precond)
+ (substitute (map cons
+ (function-vars f)
+ (cdr expr))
+ precond))
+ preconds))))
+ (else (error "make-theorem-claim/preconds: error")))
+ rest)))
+ ((if-form? expr)
+ (find-preconds (if-form-test expr)))
+ (else '())))
+ (define (build/find-if expr)
+ (cond
+ ((if-form? expr)
+ (if/if (build/find-if (if-form-test expr))
+ (build (if-form-then expr))
+ (build (if-form-else expr))))
+ ((app-form? expr)
+ (fold implies/if
+ expr
+ (map build/find-if (app-form-args expr))))
+ (else expr)))
+ (define (build expr)
+ (cond
+ ((if-form? expr)
+ (fold implies/if
+ (if/if (if-form-test expr)
+ (build (if-form-then expr))
+ (build (if-form-else expr)))
+ (find-preconds (if-form-test expr))))
+ ((app-form? expr)
+ (fold implies/if
+ (build/find-if expr)
+ (find-preconds expr)))
+ (else expr)))
+ (build expr))
+
(define/guard (make-induction-claim (f function*?)
(vars (list-of variable?))
(t theorem?))
diff --git a/vikalpa/prelude.scm b/vikalpa/prelude.scm
index c7ab89e..c61e459 100644
--- a/vikalpa/prelude.scm
+++ b/vikalpa/prelude.scm
@@ -102,11 +102,6 @@
(define-function zero? (x)
(equal? 0 x))
- (define-function natural? (x)
- (and (integer? x)
- (or (zero? x)
- (< 0 x))))
-
(define-axiom pred/succ (x)
(implies (natural? x)
(equal? (pred (succ x)) x)))
@@ -122,8 +117,6 @@
(equal? (< (pred x) x) #t)))
(define-totality-claim natural? natural? <)
-
-
(define-function + (x y)
(natural? x)
(natural? y)
@@ -131,13 +124,6 @@
y
(succ (+ (pred x) y))))
- (define-proof zero?
- ()
- ())
-
- (define-proof natural?
- ()
- ())
(define-proof +
(natural? x)
())