@ -132,6 +132,11 @@ end
open Goal
open Goal
let eq_concat ( siz , arr ) ms =
Term . (
eq ( memory ~ siz ~ arr )
( concat ( Array . map ~ f : ( fun ( siz , arr ) -> memory ~ siz ~ arr ) ms ) ) )
let fresh_var name vs zs ~ wrt =
let fresh_var name vs zs ~ wrt =
let v , wrt = Var . fresh name ~ wrt in
let v , wrt = Var . fresh name ~ wrt in
let vs = Var . Set . add vs v in
let vs = Var . Set . add vs v in
@ -244,7 +249,7 @@ let excise_seg_sub_prefix ({us; com; min; xs; sub; zs} as goal) msg ssg o_n
let com = Sh . star ( Sh . seg { msg with siz = n ; arr = a0 } ) com in
let com = Sh . star ( Sh . seg { msg with siz = n ; arr = a0 } ) com in
let min =
let min =
Sh . and_
Sh . and_
( Term . eq_concat ( o , a ) [| ( n , a0 ) ; ( o_n , a1 ) |] )
( eq_concat ( o , a ) [| ( n , a0 ) ; ( o_n , a1 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = Term . add k n ; bas = b ; len = m ; siz = o_n ; arr = a1 } )
( Sh . seg { loc = Term . add k n ; bas = b ; len = m ; siz = o_n ; arr = a1 } )
( Sh . rem_seg msg min ) )
( Sh . rem_seg msg min ) )
@ -285,7 +290,7 @@ let excise_seg_min_prefix ({us; com; min; xs; sub; zs} as goal) msg ssg n_o
Sh . and_ ( Term . eq b b' )
Sh . and_ ( Term . eq b b' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_
( Sh . and_
( Term . eq_concat ( n , a' ) [| ( o , a ) ; ( n_o , a1' ) |] )
( eq_concat ( n , a' ) [| ( o , a ) ; ( n_o , a1' ) |] )
( Sh . star
( Sh . star
( Sh . seg
( Sh . seg
{ loc = Term . add l o ; bas = b' ; len = m' ; siz = n_o ; arr = a1' } )
{ loc = Term . add l o ; bas = b' ; len = m' ; siz = n_o ; arr = a1' } )
@ -322,7 +327,7 @@ let excise_seg_sub_suffix ({us; com; min; xs; sub; zs} as goal) msg ssg l_k
in
in
let min =
let min =
Sh . and_
Sh . and_
( Term . eq_concat ( o , a ) [| ( l_k , a0 ) ; ( n , a1 ) |] )
( eq_concat ( o , a ) [| ( l_k , a0 ) ; ( n , a1 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . rem_seg msg min ) )
( Sh . rem_seg msg min ) )
@ -367,7 +372,7 @@ let excise_seg_sub_infix ({us; com; min; xs; sub; zs} as goal) msg ssg l_k
in
in
let min =
let min =
Sh . and_
Sh . and_
( Term . eq_concat ( o , a ) [| ( l_k , a0 ) ; ( n , a1 ) ; ( ko_ln , a2 ) |] )
( eq_concat ( o , a ) [| ( l_k , a0 ) ; ( n , a1 ) ; ( ko_ln , a2 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . star
( Sh . star
@ -415,7 +420,7 @@ let excise_seg_min_skew ({us; com; min; xs; sub; zs} as goal) msg ssg l_k
in
in
let min =
let min =
Sh . and_
Sh . and_
( Term . eq_concat ( o , a ) [| ( l_k , a0 ) ; ( ko_l , a1 ) |] )
( eq_concat ( o , a ) [| ( l_k , a0 ) ; ( ko_l , a1 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . seg { loc = k ; bas = b ; len = m ; siz = l_k ; arr = a0 } )
( Sh . rem_seg msg min ) )
( Sh . rem_seg msg min ) )
@ -424,7 +429,7 @@ let excise_seg_min_skew ({us; com; min; xs; sub; zs} as goal) msg ssg l_k
Sh . and_ ( Term . eq b b' )
Sh . and_ ( Term . eq b b' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_
( Sh . and_
( Term . eq_concat ( n , a' ) [| ( ko_l , a1 ) ; ( ln_ko , a2' ) |] )
( eq_concat ( n , a' ) [| ( ko_l , a1 ) ; ( ln_ko , a2' ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = ko ; bas = b' ; len = m' ; siz = ln_ko ; arr = a2' } )
( Sh . seg { loc = ko ; bas = b' ; len = m' ; siz = ln_ko ; arr = a2' } )
( Sh . rem_seg ssg sub ) ) ) )
( Sh . rem_seg ssg sub ) ) ) )
@ -460,7 +465,7 @@ let excise_seg_min_suffix ({us; com; min; xs; sub; zs} as goal) msg ssg k_l
Sh . and_ ( Term . eq b b' )
Sh . and_ ( Term . eq b b' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_
( Sh . and_
( Term . eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( o , a ) |] )
( eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( o , a ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . rem_seg ssg sub ) ) ) )
( Sh . rem_seg ssg sub ) ) ) )
@ -500,7 +505,7 @@ let excise_seg_min_infix ({us; com; min; xs; sub; zs} as goal) msg ssg k_l
Sh . and_ ( Term . eq b b' )
Sh . and_ ( Term . eq b b' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_
( Sh . and_
( Term . eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( o , a ) ; ( ln_ko , a2' ) |] )
( eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( o , a ) ; ( ln_ko , a2' ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . star
( Sh . star
@ -542,7 +547,7 @@ let excise_seg_sub_skew ({us; com; min; xs; sub; zs} as goal) msg ssg k_l
in
in
let min =
let min =
Sh . and_
Sh . and_
( Term . eq_concat ( o , a ) [| ( ln_k , a1 ) ; ( ko_ln , a2 ) |] )
( eq_concat ( o , a ) [| ( ln_k , a1 ) ; ( ko_ln , a2 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = ln ; bas = b ; len = m ; siz = ko_ln ; arr = a2 } )
( Sh . seg { loc = ln ; bas = b ; len = m ; siz = ko_ln ; arr = a2 } )
( Sh . rem_seg msg min ) )
( Sh . rem_seg msg min ) )
@ -551,7 +556,7 @@ let excise_seg_sub_skew ({us; com; min; xs; sub; zs} as goal) msg ssg k_l
Sh . and_ ( Term . eq b b' )
Sh . and_ ( Term . eq b b' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_ ( Term . eq m m' )
( Sh . and_
( Sh . and_
( Term . eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( ln_k , a1 ) |] )
( eq_concat ( n , a' ) [| ( k_l , a0' ) ; ( ln_k , a1 ) |] )
( Sh . star
( Sh . star
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . seg { loc = l ; bas = b' ; len = m' ; siz = k_l ; arr = a0' } )
( Sh . rem_seg ssg sub ) ) ) )
( Sh . rem_seg ssg sub ) ) ) )