new example: skew heaps

various stuff added to in_progress
parent 4b8b9981
theory Dyck
use export list.List
use export list.Append
type paren = L | R
type word = list paren
(* D -> eps | L D R D *)
inductive dyck word =
| Dyck_nil:
dyck Nil
| Dyck_ind:
forall w1 w2. dyck w1 -> dyck w2 -> dyck (Cons L (w1 ++ Cons R w2))
lemma dyck_concat:
forall w1 w2. dyck w1 -> dyck w2 -> dyck (w1 ++ w2)
(* the first letter, if any, must be L *)
lemma dyck_word_first:
forall w: word. dyck w ->
match w with Nil -> true | Cons c _ -> c = L end
lemma dyck_decomp:
forall w1 w2: word. dyck (w1 ++ w2) -> dyck w1 -> dyck w2
end
module Check
use import Dyck
use import list.Length
exception Failure
let rec is_dyck_rec (w: word) : word
ensures { exists p: word. dyck p && w = p ++ result &&
match result with Cons L _ -> false | _ -> true end }
raises { Failure -> forall p s: word. w = p ++ s -> not (dyck p) }
variant { length w }
=
match w with
| Cons L w ->
match is_dyck_rec w with
| Cons R w -> is_dyck_rec w
| _ -> raise Failure
end
| _ ->
w
end
let is_dyck (w: word) : bool
ensures { result <-> dyck w }
=
try is_dyck_rec w = Nil with Failure -> false end
end
......@@ -38,6 +38,7 @@ module Check
use import int.Int
use import Dyck
(* open n w = L^n w *)
function open (n: int) (w: word) : word
axiom open0: forall w: word. open 0 w = w
axiom openS: forall w: word, n: int. 0 < n ->
......
(** Warshall algorithm
Computes the transitive closure of a graph implemented as a Boolean
matrix. *)
module WarshallAlgorithm
use import int.Int
use import matrix.Matrix
(* path m i j k =
there is a path from i to j, using only vertices smaller than k *)
inductive path (matrix bool) int int int =
| Path_empty:
forall m: matrix bool, i j k: int.
get m (i,j) -> path m i j k
| Path_cons:
forall m: matrix bool, i x j k: int.
0 <= x < k -> path m i x k -> path m x j k -> path m i j k
lemma weakening:
forall m i j k1 k2. 0 <= k2 <= k1 ->
path m i j k1 -> path m i j k2
let transitive_closure (m: matrix bool) : matrix bool
requires { m.rows = m.columns }
ensures { let n = m.rows in
forall x y: int. 0 <= x < n -> 0 <= y < n ->
get result (x,y) <-> path m x y n }
=
let t = copy m in
let n = m.rows in
for k = 0 to n - 1 do
invariant { forall x y. 0 <= x < n -> 0 <= y < n ->
get t (x,y) <-> path m x y k }
for i = 0 to n - 1 do
invariant { forall x y. 0 <= x < n -> 0 <= y < n ->
get t (x,y) <->
(path m x y k || x < i && path m x y (k+1)) }
for j = 0 to n - 1 do
invariant { forall x y. 0 <= x < n -> 0 <= y < n ->
get t (x,y) <->
(path m x y k || x < i && path m x y (k+1)
|| x = i && y < j && path m x y (k+1)) }
set t (i,j) (get t (i,j) || get t (i,k) && get t (k,j))
done
done
done;
t
end
module SkewHeaps
use import bintree.Tree
use import bintree.Size
type elt
predicate le elt elt
clone relations.TotalPreOrder with type t = elt, predicate rel = le
predicate eq (x y: elt) = le x y && le y x
clone import bintree.Occ with type elt = elt, predicate eq = eq
(* [e] is no greater than the root of [t], if any *)
predicate le_root (e: elt) (t: tree elt) = match t with
| Empty -> true
| Node _ x _ -> le e x
end
(* [t] is a heap *)
predicate heap (t: tree elt) = match t with
| Empty -> true
| Node l x r -> le_root x l && heap l && le_root x r && heap r
end
predicate is_minimum (x: elt) (t: tree elt) =
mem x t && forall e. mem e t -> le x e
(* the root is the smallest element *)
let rec lemma root_is_min (l: tree elt) (x: elt) (r: tree elt) : unit
requires { heap (Node l x r) } variant { size (Node l x r) }
ensures { is_minimum x (Node l x r) }
=
match l with Empty -> () | Node ll lx lr -> root_is_min ll lx lr end;
match r with Empty -> () | Node rl rx rr -> root_is_min rl rx rr end;
()
let get_min (t: tree elt) : elt
requires { heap t && t <> Empty }
ensures { is_minimum result t }
=
match t with
| Empty -> absurd
| Node _ x _ -> x
end
let rec merge (t1 t2: tree elt) : tree elt
requires { heap t1 && heap t2 }
ensures { heap result }
ensures { forall e. occ e result = occ e t1 + occ e t2 }
variant { size t1 + size t2 }
=
match t1, t2 with
| Empty, _ -> t2
| _, Empty -> t1
| Node l1 x1 r1, Node l2 x2 r2 ->
if le x1 x2 then
Node (merge r1 t2) x1 l1
else
Node (merge r2 t1) x2 l2
end
let add (x: elt) (t: tree elt) : tree elt
requires { heap t }
ensures { heap result }
ensures { occ x result = occ x t + 1 }
ensures { forall e. not (eq e x) -> occ e result = occ e t }
=
merge (Node Empty x Empty) t
let remove_minimum (t: tree elt) : tree elt
requires { heap t && t <> Empty }
ensures { heap result }
ensures { forall e. if is_minimum e t then occ e result = occ e t - 1
else occ e result = occ e t }
=
match t with
| Empty -> absurd
| Node l _ r -> merge l r
end
end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE why3session PUBLIC "-//Why3//proof session v2//EN" "http://why3.lri.fr/why3session.dtd">
<why3session shape_version="4">
<prover
id="0"
name="Alt-Ergo"
version="0.95.2"/>
<prover
id="1"
name="CVC4"
version="1.3"/>
<prover
id="2"
name="Z3"
version="4.3.1"/>
<file
name="../skew_heaps.mlw"
verified="true"
expanded="true">
<theory
name="SkewHeaps"
locfile="../skew_heaps.mlw"
loclnum="2" loccnumb="7" loccnume="16"
verified="true"
expanded="true">
<goal
name="WP_parameter root_is_min"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="VC for root_is_min"
sum="fef8318a97953ec9908467b6bdfb21c6"
proved="true"
expanded="true"
shape="CCais_minimumV1aNodeV0V1V2aEmptyais_minimumV1aNodeV0V1V2Iais_minimumV4aNodeV3V4V5AaheapaNodeV3V4V5Aainfix &lt;asizeaNodeV3V4V5asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV2aEmptyCais_minimumV1aNodeV0V1V2aEmptyais_minimumV1aNodeV0V1V2Iais_minimumV10aNodeV9V10V11AaheapaNodeV9V10V11Aainfix &lt;asizeaNodeV9V10V11asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV2Iais_minimumV7aNodeV6V7V8AaheapaNodeV6V7V8Aainfix &lt;asizeaNodeV6V7V8asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<transf
name="split_goal_wp"
proved="true"
expanded="true">
<goal
name="WP_parameter root_is_min.1"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="1. postcondition"
sum="2dc8c87e525a3f59bd089605d9f70191"
proved="true"
expanded="false"
shape="postconditionCCais_minimumV1aNodeV0V1V2aEmptytaNodeVVVV2aEmptytaNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.02"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.2"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="2. variant decrease"
sum="f1114a5d216415d3fc4d43315a3cc18f"
proved="true"
expanded="false"
shape="variant decreaseCCtaEmptyainfix &lt;asizeaNodeV3V4V5asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV2aEmptytaNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.00"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.3"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="3. precondition"
sum="cb7d75c9db6c2ea21776af06e8faed54"
proved="true"
expanded="false"
shape="preconditionCCtaEmptyaheapaNodeV3V4V5aNodeVVVV2aEmptytaNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.4"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="4. postcondition"
sum="c411ed9584168e9f62e941d01cc9e02f"
proved="true"
expanded="false"
shape="postconditionCCtaEmptyais_minimumV1aNodeV0V1V2Iais_minimumV4aNodeV3V4V5IaheapaNodeV3V4V5aNodeVVVV2aEmptytaNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.50"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.5"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="5. variant decrease"
sum="773533fc354a2129e4cbf527a1885311"
proved="true"
expanded="false"
shape="variant decreaseCtaEmptyainfix &lt;asizeaNodeV3V4V5asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.6"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="6. precondition"
sum="2c6c0fb6940df301abb1d4f8f686d6b1"
proved="true"
expanded="false"
shape="preconditionCtaEmptyaheapaNodeV3V4V5aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.7"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="7. postcondition"
sum="42c9d1ab7c072374720cf63133be83c7"
proved="true"
expanded="false"
shape="postconditionCtaEmptyCais_minimumV1aNodeV0V1V2aEmptytaNodeVVVV2Iais_minimumV4aNodeV3V4V5IaheapaNodeV3V4V5aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.50"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.8"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="8. variant decrease"
sum="03088e399c99c70a0bed2080bc402891"
proved="true"
expanded="false"
shape="variant decreaseCtaEmptyCtaEmptyainfix &lt;asizeaNodeV6V7V8asizeaNodeV0V1V2Aainfix &lt;=c0asizeaNodeV0V1V2aNodeVVVV2Iais_minimumV4aNodeV3V4V5IaheapaNodeV3V4V5aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.9"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="9. precondition"
sum="07ea83be5881d93841b301cc6113c653"
proved="true"
expanded="false"
shape="preconditionCtaEmptyCtaEmptyaheapaNodeV6V7V8aNodeVVVV2Iais_minimumV4aNodeV3V4V5IaheapaNodeV3V4V5aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter root_is_min.10"
locfile="../skew_heaps.mlw"
loclnum="32" loccnumb="16" loccnume="27"
expl="10. postcondition"
sum="7df863169764397ad87f7e2924ee1730"
proved="true"
expanded="true"
shape="postconditionCtaEmptyCtaEmptyais_minimumV1aNodeV0V1V2Iais_minimumV7aNodeV6V7V8IaheapaNodeV6V7V8aNodeVVVV2Iais_minimumV4aNodeV3V4V5IaheapaNodeV3V4V5aNodeVVVV0IaheapaNodeV0V1V2F">
<label
name="why3:lemma"/>
<label
name="expl:VC for root_is_min"/>
<proof
prover="1"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.14"/>
</proof>
</goal>
</transf>
</goal>
<goal
name="WP_parameter get_min"
locfile="../skew_heaps.mlw"
loclnum="40" loccnumb="6" loccnume="13"
expl="VC for get_min"
sum="5168b4c04b86122ea6cba7b6fb060998"
proved="true"
expanded="false"
shape="CfaEmptyais_minimumV1V0aNodewVwV0INainfix =V0aEmptyAaheapV0F">
<label
name="expl:VC for get_min"/>
<transf
name="split_goal_wp"
proved="true"
expanded="false">
<goal
name="WP_parameter get_min.1"
locfile="../skew_heaps.mlw"
loclnum="40" loccnumb="6" loccnume="13"
expl="1. unreachable point"
sum="4916090a0461498a26f6df2449c2ecf7"
proved="true"
expanded="false"
shape="unreachable pointCfaEmptytaNodewVwV0INainfix =V0aEmptyAaheapV0F">
<label
name="expl:VC for get_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.02"/>
</proof>
</goal>
<goal
name="WP_parameter get_min.2"
locfile="../skew_heaps.mlw"
loclnum="40" loccnumb="6" loccnume="13"
expl="2. postcondition"
sum="2d377770f1cbea16aa626b01cd121962"
proved="true"
expanded="false"
shape="postconditionCtaEmptyais_minimumV1V0aNodewVwV0INainfix =V0aEmptyAaheapV0F">
<label
name="expl:VC for get_min"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.02"/>
</proof>
</goal>
</transf>
</goal>
<goal
name="WP_parameter merge"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="VC for merge"
sum="6fffd2f8629c44e61b551901d67f99bb"
proved="true"
expanded="false"
shape="CCiainfix =aoccV10V9ainfix +aoccV10V0aoccV10V1FAaheapV9LaNodeV8V3V2Iainfix =aoccV11V8ainfix +aoccV11V4aoccV11V0FAaheapV8FAaheapV0AaheapV4Aainfix &lt;ainfix +asizeV4asizeV0ainfix +asizeV0asizeV1Aainfix &lt;=c0ainfix +asizeV0asizeV1ainfix =aoccV14V13ainfix +aoccV14V0aoccV14V1FAaheapV13LaNodeV12V6V5Iainfix =aoccV15V12ainfix +aoccV15V7aoccV15V1FAaheapV12FAaheapV1AaheapV7Aainfix &lt;ainfix +asizeV7asizeV1ainfix +asizeV0asizeV1Aainfix &lt;=c0ainfix +asizeV0asizeV1aleV6V3aNodeVVVainfix =aoccV16V1ainfix +aoccV16V0aoccV16V1FAaheapV1aEmptyV0aNodeVVVCainfix =aoccV17V1ainfix +aoccV17V0aoccV17V1FAaheapV1aEmptyainfix =aoccV18V0ainfix +aoccV18V0aoccV18V1FAaheapV0wV0aEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<transf
name="split_goal_wp"
proved="true"
expanded="false">
<goal
name="WP_parameter merge.1"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="1. variant decrease"
sum="6007cc158e0f2c9140e5fc0c8e9b9209"
proved="true"
expanded="false"
shape="variant decreaseCCainfix &lt;ainfix +asizeV7asizeV1ainfix +asizeV0asizeV1Aainfix &lt;=c0ainfix +asizeV0asizeV1IaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.2"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="2. precondition"
sum="96edf08527c033f5ddba51fdbe09671f"
proved="true"
expanded="false"
shape="preconditionCCaheapV1AaheapV7IaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.3"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="3. postcondition"
sum="a8601d4f268181d83cb019ca09b668b9"
proved="true"
expanded="false"
shape="postconditionCCaheapV9LaNodeV8V6V5Iainfix =aoccV10V8ainfix +aoccV10V7aoccV10V1FAaheapV8FIaheapV1AaheapV7IaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="2"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.26"/>
</proof>
</goal>
<goal
name="WP_parameter merge.4"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="4. postcondition"
sum="8e8bba9fba07912286b65cc783f2c759"
proved="true"
expanded="false"
shape="postconditionCCainfix =aoccV10V9ainfix +aoccV10V0aoccV10V1FLaNodeV8V6V5Iainfix =aoccV11V8ainfix +aoccV11V7aoccV11V1FAaheapV8FIaheapV1AaheapV7IaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.04"/>
</proof>
</goal>
<goal
name="WP_parameter merge.5"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="5. variant decrease"
sum="f9a885bb7db76a425e7f5b9634c7d0c7"
proved="true"
expanded="false"
shape="variant decreaseCCainfix &lt;ainfix +asizeV4asizeV0ainfix +asizeV0asizeV1Aainfix &lt;=c0ainfix +asizeV0asizeV1INaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.6"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="6. precondition"
sum="d5741bcf980d174f116a4be3482a387d"
proved="true"
expanded="false"
shape="preconditionCCaheapV0AaheapV4INaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.7"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="7. postcondition"
sum="0ead3cb6a74853e8bb1f22de59dd949f"
proved="true"
expanded="false"
shape="postconditionCCaheapV9LaNodeV8V3V2Iainfix =aoccV10V8ainfix +aoccV10V4aoccV10V0FAaheapV8FIaheapV0AaheapV4INaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="2"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="2.73"/>
</proof>
</goal>
<goal
name="WP_parameter merge.8"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="8. postcondition"
sum="e19e79411f65af1036025d955c4a5af9"
proved="true"
expanded="false"
shape="postconditionCCainfix =aoccV10V9ainfix +aoccV10V0aoccV10V1FLaNodeV8V3V2Iainfix =aoccV11V8ainfix +aoccV11V4aoccV11V0FAaheapV8FIaheapV0AaheapV4INaleV6V3aNodeVVVtaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.06"/>
</proof>
</goal>
<goal
name="WP_parameter merge.9"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="9. postcondition"
sum="9293b5ed5bbefd4180cbd082671691bd"
proved="true"
expanded="false"
shape="postconditionCCtaNodeVVVaheapV1aEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.10"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="10. postcondition"
sum="dde839758528b8111756378548859dd0"
proved="true"
expanded="false"
shape="postconditionCCtaNodeVVVainfix =aoccV8V1ainfix +aoccV8V0aoccV8V1FaEmptyV0aNodeVVVtaEmptyV1IaheapV1AaheapV0F">
<label
name="expl:VC for merge"/>
<proof
prover="0"
timelimit="6"
memlimit="1000"
obsolete="false"
archived="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter merge.11"
locfile="../skew_heaps.mlw"
loclnum="49" loccnumb="10" loccnume="15"
expl="11. postcondition"
sum="61d9410147e5bc25a320329feef69d70"
proved="true"
expanded="false"
shape="postconditionCtaNodeVVVCaheapV1aEmptytwV0aEmptyV1IaheapV1AaheapV0F">