summaryrefslogtreecommitdiff
path: root/proofs/signatures/th_bv.plf
blob: 8c972accfd0f7feb8f64bb8e3b98bf9b09bb1277 (plain)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
;a = b ^ a = 0 ^ b = 1

; "bitvec" is a term of type "sort"
(declare BitVec sort)

; bit type
(declare bit type)
(declare b0 bit)
(declare b1 bit)

; bit vector type
(declare bv type)
(declare bvn bv)
(declare bvc (! b bit (! v bv bv)))
; a bv constant term
(declare a_bv (! v bv (term BitVec)))

; calculate the length of a bitvector
(program bv_len ((v bv)) mpz 
  (match v
    (bvn 0)
    ((bvc b v') (mp_add (bv_len v') 1))))

; a bv variable
(declare var_bv type)
; a bv variable term
(declare a_var_bv (! v var_bv (term BitVec)))



; bit vector operators
(define bvoper (! x (term BitVec) 
               (! y (term BitVec) 
                    (term BitVec))))
(declare bvand bvoper)
(declare bvadd bvoper)
;....

; variable used for bit-blasting (must be simply-typed)
(declare bbl_var type)

; all bit-vector terms are mapped with "bv_atom" to:
;  - a simply-typed term of type "bbl_var", which is used for bit-blasting
;  - a integer size
(declare bv_atom (! x (term BitVec) (! y bbl_var (! n mpz type))))

(declare decl_bv_atom_var (! n mpz    ; must be specified
                          (! x var_bv
                          (! p (! w bbl_var
                               (! u (bv_atom (a_var_bv x) w n)
                                 (holds cln)))
                             (holds cln)))))

(declare decl_bv_atom_const (! n mpz
                            (! v bv
                            (! s (^ (bv_len v) n)
                            (! p (! w bbl_var
                                 (! u (bv_atom (a_bv v) w n)
                                   (holds cln)))
			      (holds cln))))))


; a predicate to represent the n^th bit of a bitvector term
(declare bblast (! x bbl_var (! n mpz formula)))

; bit blast  constant
(program bblast_const ((x bbl_var) (v bv) (n mpz)) formula
  (match v
    (bvn (mp_ifneg n true (fail formula)))
    ((bvc b v') (let n' (mp_add n (~ 1))
                (let f (match b (b0 (not (bblast x n))) (b1 (bblast x n)))
                  (mp_ifzero n' f (and f (bblast_const x v' n'))))))))

(declare bv_bbl_const (! n mpz
                      (! f formula
                      (! v bv
                      (! x bbl_var
                      (! u (bv_atom (a_bv v) x n)
                      (! c (^ (bblast_const x v (mp_add n (~ 1))) f)
                         (th_holds f))))))))

; bit blast  x = y
(program bblast_eq ((x bbl_var) (y bbl_var) (n mpz)) formula
  (let n' (mp_add n (~ 1))
  (let f (iff (bblast x n) (bblast y n))
  (mp_ifzero n' f (and f (bblast_eq x y n'))))))

(declare bv_bbl_eq (! x (term BitVec)
                   (! y (term BitVec)
                   (! n mpz
                   (! f formula
                   (! x' bbl_var
                   (! y' bbl_var
                   (! ux' (bv_atom x x' n)
                   (! uy' (bv_atom y y' n)
                   (! u (th_holds (= BitVec x y))
                   (! c (^ (bblast_eq x' y' (mp_add n (~ 1))) f)
                      (th_holds f))))))))))))


; rewrite rule :
; x + y = y + x
(declare bvadd_symm (! x (term BitVec)
                    (! y (term BitVec)
                    (! x' bbl_var
                    (! y' bbl_var
                    (! n mpz
                    (! ux (bv_atom x x' n)
                    (! uy (bv_atom y y' n)
                       (th_holds (= BitVec (bvadd x y) (bvadd y x)))))))))))

(program calc_bvand ((a bv) (b bv)) bv
  (match a
    (bvn (match b (bvn bvn) (default (fail bv))))
    ((bvc ba a') (match b
                      ((bvc bb b') (bvc (match ba (b0 b0) (b1 bb)) (calc_bvand a' b')))
                      (default (fail bv))))))

; rewrite rule (w constants) :
; a & b = c    
(declare bvand_const (! c bv
		     (! a bv
                     (! b bv
                     (! u (^ (calc_bvand a b) c)
                        (th_holds (= BitVec (bvand (a_bv a) (a_bv b)) (a_bv c))))))))                        
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback