summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasaya Tojo <masaya@tojo.tokyo>2020-11-18 23:07:08 +0900
committerMasaya Tojo <masaya@tojo.tokyo>2020-11-18 23:07:08 +0900
commit31901d7bc02e464dd194f4b235287b5dce056471 (patch)
tree1669e509de1909106805c69a048a344ba8cfd0c8
parenta11683d118505ad3ca9c27a5734fae9ee122267c (diff)
wip22
-rw-r--r--vikalpa.scm206
1 files changed, 116 insertions, 90 deletions
diff --git a/vikalpa.scm b/vikalpa.scm
index 4454e52..c66e130 100644
--- a/vikalpa.scm
+++ b/vikalpa.scm
@@ -61,7 +61,8 @@
(cond ((expr-quoted? expr)
(or (integer? (expr-unquote expr))
(boolean? (expr-unquote expr))
- (symbol? (expr-unquote expr))))
+ (symbol? (expr-unquote expr))
+ (null? (expr-unquote expr))))
((if-form? expr)
(and (expression? (if-form-test expr))
(expression? (if-form-then expr))
@@ -402,27 +403,21 @@
(define (primitive-function? x)
(and (list? x)
- (= 4 (length x))
- (variable? (list-ref x 0))
+ (= 3 (length x))
+ (variable? (primitive-function-name x))
(eq? 'primitive-function (list-ref x 1))
- (let ((ps (list-ref x 2)))
- (and (list? ps)
- (every procedure? ps)))
- (procedure? (list-ref x 3))))
+ (vars? (primitive-function-vars x))))
-;; (primitive-function variable? (list-of procedure?) procedure?) -> primitive-function?
-(define (primitive-function name ps proc)
- (list name 'primitive-function ps proc))
+;; (primitive-function variable? vars?) -> primitive-function?
+(define (primitive-function name vs)
+ (list name 'primitive-function vs))
(define (primitive-function-name pf)
(list-ref pf 0))
-(define (primitive-function-preds pf)
+(define (primitive-function-vars pf)
(list-ref pf 2))
-(define (primitive-function-proc pf)
- (list-ref pf 3))
-
(define (match-primitive-function pf expression)
(and (pair? expression)
(eq? (primitive-function-name pf) (car expression))
@@ -457,6 +452,9 @@
(define (function-expression f)
(list-ref f 3))
+(define (definition-name d)
+ (list-ref d 0))
+
(define (mrule? x)
(and (list? x)
(= 3 (length x))
@@ -580,6 +578,24 @@
new-expr)
(expand* ms new-expr)))))
+(define (quote-all x)
+ (cond
+ ((expr-quoted? x) x)
+ ((if-form? x)
+ (if-form (quote-all (if-form-test x))
+ (quote-all (if-form-then x))
+ (quote-all (if-form-else x))))
+ ((app-form? x)
+ (cons (app-form-name x)
+ (map quote-all (app-form-args x))))
+ ((variable? x) x)
+ (else `',x)))
+
+(define (convert-to-expression x)
+ (quote-all
+ (expand* (filter macro? (system-definitions (current-system)))
+ x)))
+
;; (axiom variable? vars? expression?) -> axiom?
;; axiom? is theorem*
(define/guard (axiom (name variable?) (vars vars?) (expr expression?))
@@ -784,11 +800,7 @@
(else
(fail (format #f "no match-function (~a)" cmd)))))
((primitive-function? x)
- (cond
- ((match-primitive-function x extracted-expr)
- (apply-primitive-function x extracted-expr))
- (else
- (fail "can't apply-primitive-function (~a)" cmd))))
+ (fail "primitive-function fail"))
((macro? x)
(fail "macro fail"))
(else
@@ -881,7 +893,8 @@
(define-syntax define-axiom
(syntax-rules ()
((_ name (var ...) expr)
- (let ((t (axiom 'name '(var ...) 'expr)))
+ (let ((t (axiom 'name '(var ...)
+ (convert-to-expression 'expr))))
(validate-theorem t)
(add-definition t)
t))))
@@ -889,7 +902,8 @@
(define-syntax define-theorem
(syntax-rules ()
((_ name (var ...) expr)
- (let ((t (theorem 'name '(var ...) 'expr)))
+ (let ((t (theorem 'name '(var ...)
+ (convert-to-expression 'expr))))
(validate-theorem t)
(add-definition t)
t))))
@@ -897,15 +911,16 @@
(define-syntax define-function
(syntax-rules ()
((_ name (var ...) expr)
- (let ((f (function 'name '(var ...) 'expr)))
+ (let ((f (function 'name '(var ...)
+ (convert-to-expression 'expr))))
(validate-function f)
(add-definition f)
f))))
-(define-syntax define-primitivge-function
+(define-syntax define-primitive-function
(syntax-rules ()
- ((_ name (p? ...) proc)
- (let ((f (primitive-function 'name (list p? ...) proc)))
+ ((_ name (var ...))
+ (let ((f (primitive-function 'name '(var ...))))
(add-definition f)
f))))
@@ -936,107 +951,69 @@
(define (any? x) #t)
(define-system prelude ()
- (define-primitivge-function natural?
- (any?)
- natural?)
-
- (define-primitivge-function equal?
- (any? any?)
- equal?)
-
- (define-primitivge-function atom?
- (any?)
- (lambda (x) (not (pair? x))))
-
- (define-primitivge-function cons
- (any? any?)
- cons)
-
- (define-primitivge-function car
- (pair?)
- car)
-
- (define-primitivge-function cdr
- (pair?)
- cdr)
-
- (define-primitivge-function size
- (any?)
- size)
-
+ (define-primitive-function natural? (x))
+ (define-primitive-function equal? (x y))
+ (define-primitive-function atom? (x))
+ (define-primitive-function cons (x y))
+ (define-primitive-function car (x))
+ (define-primitive-function cdr (x))
+ (define-primitive-function size (x))
+ (define-primitive-function < (x y))
+ (define-primitive-function not (x))
+
(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)
(if (equal? x y) (equal? x y) '#t))
-
(define-axiom atom/cons (x y)
(equal? (atom? (cons x y)) '#f))
-
(define-axiom car/cons (x y)
(equal? (car (cons x y)) x))
-
(define-axiom cdr/cons (x y)
(equal? (cdr (cons x y)) y))
-
(define-axiom cons/car+cdr (x)
(if (atom? x)
'#t
(equal? (cons (car x) (cdr x)) x)))
-
(define-axiom if-nest (x y z)
(if x
(equal? (if x y z) y)
(equal? (if x y z) z)))
-
(define-axiom if-nest-t (x y z)
(if x
(equal? (if x y z) y)
'#t))
-
(define-axiom if-nest-f (x y z)
(if x
'#t
(equal? (if x y z) z)))
-
(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 natural/size (x)
(equal? (natural? (size x))
'#t))
-
(define-axiom size/car (x)
(if (atom? x)
'#t
(equal? (< (size (car x)) (size x))
'#t)))
-
(define-axiom size/cdr (x)
(if (atom? x)
'#t
(equal? (< (size (cdr x)) (size x))
'#t)))
+ (define-axiom if-not (x y z)
+ (equal? (if (not x) y z)
+ (if x z y)))
(define-macro list ()
((list) '())
((list x . y) (cons x (list . y))))
- (define-macro + ()
- ((+) '0)
- ((+ x) x)
- ((+ x . xs) (b+ x (+ . xs))))
-
- (define-macro - ()
- ((- x) (u- x))
- ((- x . xs) (+ x . (u- (+ . xs)))))
-
(define-macro and ()
((and) '#t)
((and x) x)
@@ -1047,13 +1024,16 @@
((or x) x)
((or x . xs) (if x x (or . xs))))
- (define-axiom if-not (x y z)
- (equal? (if (not x)
- y
- z)
- (if x
- z
- y))))
+ #;
+ (define-macro + ()
+ ((+) '0)
+ ((+ x) x)
+ ((+ x . xs) (b+ x (+ . xs))))
+ #;
+ (define-macro - ()
+ ((- x) (u- x))
+ ((- x . xs) (+ x . (u- (+ . xs)))))
+)
(define (measure? x)
(and (pair? x)
@@ -1105,8 +1085,18 @@
(define (make-total-claim/natural m vars f)
(let ((name (function-name f))
- (m-expr (list (function-name m)
- (function-app-form f))))
+ (m-expr (cons (function-name m) vars)))
+ (define (convert app-form)
+ (cond
+ ((apply-rule '()
+ (rule vars
+ '()
+ (cons (function-name f) vars)
+ m-expr)
+ app-form
+ '())
+ => identity)
+ (else (error "make-total-claim/natural: convert error"))))
(if/if `(natural? ,m-expr)
(let loop ((expr (function-expression f)))
(cond
@@ -1128,7 +1118,7 @@
(else (and/if (loop (car args))
(f (cdr args))))))))
(if (eq? name (app-form-name expr))
- (and/if `(< ,(list (function-name m) expr) ,m-expr)
+ (and/if `(< ,(convert expr) ,m-expr)
rest)
rest)))
(else (error "(vikalpa) make-total-claim: error"))))
@@ -1317,8 +1307,7 @@
((2 3 1) atom/cons)
((2 3) if-false)
((2) if-same)
- (() if-same)
- ))
+ (() if-same)))
(define-proof associate-app
(induction (app x y))
@@ -1353,5 +1342,42 @@
y
(cons (car x) (app (cdr x) y))))
-;; (define (review sys)
-;; )
+(define (check sys)
+ (let loop ((sys sys)
+ (fails '()))
+ (let ((defs (system-definitions sys)))
+ (define* (next #:optional fail)
+ (loop (make-system (cdr defs)
+ (system-proofs sys))
+ (if fail
+ (cons fail fails)
+ fails)))
+ (cond
+ ((null? defs) fails)
+ ((or (theorem? (car defs))
+ (function? (car defs)))
+ (cond
+ ((and (function? (car defs))
+ (trivial-total? (car defs)))
+ (format #t "~a が全域なのは自明で〜す~%" (definition-name (car defs)))
+ (next))
+ (else
+ (cond
+ ((find-proof (definition-name (car defs)) sys)
+ => (lambda (pf)
+ (let ((result (prove sys (car defs) pf)))
+ (cond
+ ((equal? result ''#t)
+ (format #t "~a が全域であると証明しました!!~%"
+ (definition-name (car defs)))
+ (next))
+ (else
+ (format #t "~a の証明に失敗しました(しょぼ〜ん)~%~y"
+ (definition-name (car defs))
+ result)
+ (next (definition-name (car defs))))))))
+ (else
+ (format #t "~a の証明がありません(しょぼ〜ん)~%"
+ (definition-name (car defs))))))))
+ (else
+ (next))))))