File: mlayers.lisp

package info (click to toggle)
acl2 8.6%2Bdfsg-2
  • links: PTS
  • area: main
  • in suites: trixie
  • size: 1,111,420 kB
  • sloc: lisp: 17,818,294; java: 125,359; python: 28,122; javascript: 23,458; cpp: 18,851; ansic: 11,569; perl: 7,678; xml: 5,591; sh: 3,976; makefile: 3,833; ruby: 2,633; yacc: 1,126; ml: 763; awk: 295; csh: 233; lex: 197; php: 178; tcl: 49; asm: 23; haskell: 17
file content (73 lines) | stat: -rw-r--r-- 3,086 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
;; Copyright (C) 2024 Carl Kwan
;;
;; Theorems for partitioning a matrix along the first "layer"
;;
;; Requires:
(in-package "ACL2")
(include-book "mout")

(local (set-induction-depth-limit 1))

(defthmd rewrap-matrix
 (implies (and (matrixp m) (not (m-emptyp (row-cdr m))))
          (equal (row-cons (row-car m)
                           (col-cons (col-car (row-cdr m))
                                     (col-cdr (row-cdr m))))
                 m))
 :hints (("Goal" :use ((:instance col-cons-elim (m (row-cdr m)))
                       (:instance row-cons-elim)))))


(defthmd m*-expand-row
 (implies (and (m*-guard A B) (not (m-emptyp A)))
          (equal (m* A B)
                 (row-cons (col* (row-car A) B)
                           (m* (row-cdr A) B))))
  :hints (("Goal" :use ((:instance m* (M A) (N B))))))

(defthm m*-expand-layer
 (implies (and (matrixp A) (matrixp B)
               (equal (col-count A) (row-count B))
               (not (m-emptyp (row-cdr A))))
          (equal (m* A B)
                 (row-cons (col* (row-car A) B)
                           (col-cons (row* (col-car B) (row-cdr A))
                                     (m* (row-cdr A) (col-cdr B))))))
  :hints (("Goal" :use ((:instance m*-expand-row)))))

(encapsulate
 nil
 (local (in-theory (disable m+-comm)))
 (local
  (defthm m*-m*-by-out-*-cdr
   (implies (and (matrixp A)
                 (matrixp B)
                 (equal (col-count A) (row-count B))
                 (not (m-emptyp (col-cdr (row-cdr A))))
                 (not (m-emptyp (row-cdr (col-cdr B)))))
            (equal (m* (row-cdr A) (col-cdr B))
                   (m+ (out-* (col-car (row-cdr A)) (row-car (col-cdr B)))
                       (m* (col-cdr (row-cdr A)) (row-cdr (col-cdr B))))))
  :hints (("Goal" :use ((:instance m*-m*-by-out-* (m (row-cdr A)) (n (col-cdr B)))
                        (:instance m*-m*-by-out-*
                                   (m (col-cdr (row-cdr A)))
                                   (n (row-cdr (col-cdr B))))
                        (:instance m*-by-out-* (m (row-cdr A)) (n (col-cdr B))))))))

 (defthm m*-expand-2-layers
  (implies (and (matrixp A)
                (matrixp B)
                (equal (col-count A) (row-count B))
                (not (m-emptyp (col-cdr (row-cdr A))))
                (not (m-emptyp (row-cdr (col-cdr B)))))
           (equal (m* A B)
                  (row-cons (col* (row-car A) B)
                            (col-cons (row* (col-car B) (row-cdr A))
                                      (m+ (out-* (col-car (row-cdr A))
                                                 (row-car (col-cdr B)))
                                          (m* (col-cdr (row-cdr A))
                                              (row-cdr (col-cdr B))))))))
   :hints (("Goal" :use ((:instance m*-m*-by-out-* (m (row-cdr A)) (n (col-cdr B)))
                         (:instance m*-expand-layer)
                         (:instance m*-by-out-* (m (row-cdr A)) (n (col-cdr B))))
                   :in-theory (e/d nil (m*-m*-by-out-* m*-by-out-* m* m+))))))