binomial heaps: all lemmas proved, but one

parent 482fde78
(** Binomial heaps.
(** Binomial heaps (Jean Vuillemin, 1978).
Purely applicative implementation, following Okasaki's implementation
in Purely Functional Data Structures (Section 3.2).
Author: Jean-Christophe Filliâtre (CNRS)
*)
......@@ -10,18 +13,38 @@ module BinomialHeap
use import list.List
use import list.Length
use import list.Reverse
use import list.Append
(** The type of elements, together with a total pre-order *)
type elt
predicate le elt elt
clone relations.TotalPreOrder with type t = elt, predicate rel = le
(** Trees.
These are arbitrary trees, not yet constrained
to be binomial trees. Field [rank] is used later to store the rank
of the binomial tree, for access in constant time. *)
type tree = {
elem: elt;
elem: elt;
children: list tree;
rank: int;
rank: int;
}
function size (l: list tree) : int =
match l with
| Nil -> 0
| Cons { children = c } r -> 1 + size c + size r
end
lemma size_nonnneg:
forall l. size l >= 0
(** Heaps. *)
(* [e] is no greater than the roots of the trees in [l] *)
predicate le_roots (e: elt) (l: list tree) =
match l with
......@@ -32,24 +55,18 @@ module BinomialHeap
lemma le_roots_trans:
forall x y l. le x y -> le_roots y l -> le_roots x l
(* [l] is a list of heaps *)
predicate heaps (l: list tree) =
match l with
| Nil -> true
| Cons { elem = e; children = c } r -> le_roots e c && heaps c && heaps r
end
lemma heaps_append:
forall h1 "induction" h2. heaps h1 -> heaps h2 -> heaps (h1 ++ h2)
lemma heaps_reverse:
forall h. heaps h -> heaps (reverse h)
(* function rank (t: tree) : int = *)
(* length t.children *)
function link (t1 t2: tree) : tree =
if le t1.elem t2.elem then
{ elem = t1.elem; rank = t1.rank + 1; children = Cons t2 t1.children }
else
{ elem = t2.elem; rank = t2.rank + 1; children = Cons t1 t2.children }
(** Number of occurrences of a given element in a list of trees. *)
function occ (x: elt) (l: list tree) : int =
match l with
......@@ -58,17 +75,16 @@ module BinomialHeap
(if x = y then 1 else 0) + occ x c + occ x r
end
lemma occ_nonneg:
forall x l. 0 <= occ x l
(*
let rec lemma occ_nonneg (x: elt) (l: list tree)
variant { l }
variant { size l }
ensures { 0 <= occ x l }
= match l with
| Nil -> ()
| Cons { elem = y; children = c } r -> occ_nonneg x c; occ_nonneg x r
| Nil -> ()
| Cons { children = c } r -> occ_nonneg x c; occ_nonneg x r
end
*)
lemma occ_append:
forall l1 "induction" l2 x. occ x (l1 ++ l2) = occ x l1 + occ x l2
lemma occ_reverse:
forall x l. occ x l = occ x (reverse l)
......@@ -76,33 +92,67 @@ module BinomialHeap
predicate mem (x: elt) (l: list tree) =
occ x l > 0
lemma heaps_mem:
forall x l.
le_roots x l -> forall y. mem y l -> le x y
let rec lemma heaps_mem (l: list tree)
requires { heaps l }
variant { size l }
ensures { forall x. le_roots x l -> forall y. mem y l -> le x y }
= match l with
| Nil -> ()
| Cons { children = c } r -> heaps_mem c; heaps_mem r
end
(** Binomial tree of rank [k]. *)
predicate has_order (k: int) (l: list tree) =
match l with
| Nil -> k = 0
| Cons { children = c } r -> has_order (k-1) c && has_order (k-1) r
| Nil ->
k = 0
| Cons { rank = k'; children = c } r ->
k' = k - 1 && has_order (k-1) c && has_order (k-1) r
end
predicate binomial_tree (t: tree) =
t.rank = length t.children &&
has_order t.rank t.children
(* a binomial heap is a list of trees *)
lemma has_order_length:
forall l k. has_order k l -> length l = k
(** Binomial heaps. *)
type heap = list tree
(* h is a list of binomial trees in strict increasing order of ranks
no smaller than m *)
(** A heap [h] is a list of binomial trees in strict increasing order of
ranks, those ranks being no smaller than [m]. *)
predicate inv (m: int) (h: heap) =
match h with
| Nil -> true
| Cons t r -> let k = t.rank in m <= k && binomial_tree t && inv (k + 1) r
end
lemma inv_reverse:
forall t. binomial_tree t -> inv 0 (reverse t.children)
lemma inv_trans:
forall m1 m2 h. m1 <= m2 -> inv m2 h -> inv m1 h
let lemma inv_reverse (t: tree)
requires { binomial_tree t }
ensures { inv 0 (reverse t.children) }
= let rec aux (k: int) (l: list tree) (acc: list tree)
requires { has_order k l }
requires { inv k acc }
variant { k }
ensures { inv 0 (reverse l ++ acc) }
= match l with
| Nil -> ()
| Cons t r ->
assert { binomial_tree t };
aux (k-1) r (Cons t acc)
end in
match t with
| { rank = k; children = c } -> aux k c Nil
end
(** Heap operations. *)
let empty () : heap
ensures { heaps result }
......@@ -138,6 +188,12 @@ module BinomialHeap
aux t.elem l
end
function link (t1 t2: tree) : tree =
if le t1.elem t2.elem then
{ elem = t1.elem; rank = t1.rank + 1; children = Cons t2 t1.children }
else
{ elem = t2.elem; rank = t2.rank + 1; children = Cons t1 t2.children }
let rec add_tree (t: tree) (h: heap)
requires { heaps (Cons t Nil) }
requires { binomial_tree t }
......@@ -225,18 +281,35 @@ module BinomialHeap
let (t, h') = extract_min_tree 0 h in
(t.elem, merge 0 (reverse t.children) h')
(* complexity analysis *)
(** Complexity analysis. *)
use import int.Power
function size (l: list tree) : int =
match l with
| Nil -> 0
| Cons { children = c } r -> 1 + size c + size r
let rec lemma has_order_size (k: int) (l: list tree)
requires { has_order k l }
variant { size l }
ensures { size l = power 2 k - 1 }
= match l with
| Nil -> ()
| Cons { children = c } r -> has_order_size (k-1) c; has_order_size (k-1) r
end
lemma binomial_tree_size:
forall k t. has_order k t.children -> size t.children = power 2 k - 1
forall t. binomial_tree t -> size t.children = power 2 t.rank - 1
let rec lemma inv_size (k: int) (l: list tree)
requires { 0 <= k }
requires { inv k l }
variant { l }
ensures { size l >= power 2 (k + length l) - power 2 k }
= match l with
| Nil -> ()
| Cons _ r -> inv_size (k+1) r
end
(** Finally we prove that the number of binomial trees is O(log n) *)
lemma heap_size:
forall h. inv 0 h -> size h >= power 2 (length h) - 1
end
......@@ -6,56 +6,173 @@
<prover id="1" name="Alt-Ergo" version="1.01" timelimit="6" steplimit="0" memlimit="1000"/>
<prover id="2" name="Eprover" version="1.8-001" timelimit="6" steplimit="0" memlimit="1000"/>
<file name="../binomial_heap.mlw" expanded="true">
<theory name="BinomialHeap" sum="0b4cf8ddb9d3580c11d55bf59ef6dc13" expanded="true">
<theory name="BinomialHeap" sum="8eac636d5b2ef3198243fe3fccc449ba" expanded="true">
<goal name="size_nonnneg" expanded="true">
</goal>
<goal name="le_roots_trans">
<proof prover="0"><result status="unknown" time="0.01"/></proof>
<proof prover="1"><result status="unknown" time="0.02"/></proof>
<transf name="induction_ty_lex">
<goal name="le_roots_trans.1" expl="1.">
<proof prover="0"><result status="valid" time="0.01"/></proof>
</goal>
</transf>
</goal>
<goal name="heaps_append">
<transf name="induction_ty_lex">
<goal name="heaps_append.1" expl="1.">
<transf name="split_goal_wp">
<goal name="heaps_append.1.1" expl="1.">
<proof prover="0"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="heaps_append.1.2" expl="2.">
<proof prover="2"><result status="valid" time="0.41"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="heaps_reverse">
<proof prover="0"><result status="timeout" time="6.98"/></proof>
<proof prover="1"><result status="unknown" time="0.03"/></proof>
<transf name="induction_ty_lex">
<goal name="heaps_reverse.1" expl="1.">
<proof prover="2"><result status="valid" time="0.99"/></proof>
</goal>
</transf>
</goal>
<goal name="occ_nonneg">
<proof prover="0"><result status="timeout" time="6.01"/></proof>
<proof prover="1"><result status="unknown" time="0.03"/></proof>
<goal name="WP_parameter occ_nonneg" expl="VC for occ_nonneg">
<proof prover="0"><result status="valid" time="0.06"/></proof>
</goal>
<goal name="occ_append">
<transf name="induction_ty_lex">
<goal name="occ_append.1" expl="1.">
<transf name="split_goal_wp">
<goal name="occ_append.1.1" expl="1.">
<proof prover="0"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="occ_append.1.2" expl="2.">
<transf name="compute_in_goal">
<goal name="occ_append.1.2.1" expl="1.">
<proof prover="0"><result status="valid" time="0.37"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="occ_reverse">
<proof prover="0"><result status="timeout" time="6.01"/></proof>
<proof prover="1"><result status="unknown" time="0.06"/></proof>
<transf name="induction_ty_lex">
<goal name="occ_reverse.1" expl="1.">
<proof prover="0"><result status="valid" time="0.25"/></proof>
</goal>
</transf>
</goal>
<goal name="heaps_mem">
<proof prover="0"><result status="timeout" time="6.02"/></proof>
<proof prover="1"><result status="unknown" time="0.05"/></proof>
<goal name="WP_parameter heaps_mem" expl="VC for heaps_mem">
<proof prover="0"><result status="valid" time="0.03"/></proof>
</goal>
<goal name="has_order_length">
<transf name="induction_ty_lex">
<goal name="has_order_length.1" expl="1.">
<transf name="split_goal_wp">
<goal name="has_order_length.1.1" expl="1.">
<proof prover="0"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="has_order_length.1.2" expl="2.">
<transf name="compute_in_goal">
<goal name="has_order_length.1.2.1" expl="1.">
<proof prover="1"><result status="valid" time="0.45" steps="629"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="inv_reverse">
<proof prover="0" obsolete="true"><result status="timeout" time="6.02"/></proof>
<proof prover="1" obsolete="true"><result status="unknown" time="0.07"/></proof>
<goal name="inv_trans">
<transf name="induction_ty_lex">
<goal name="inv_trans.1" expl="1.">
<proof prover="0"><result status="valid" time="0.02"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter inv_reverse" expl="VC for inv_reverse">
<transf name="split_goal_wp">
<goal name="WP_parameter inv_reverse.1" expl="1. postcondition">
<proof prover="0"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="33"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.2" expl="2. assertion">
<proof prover="1"><result status="valid" time="0.14" steps="293"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.3" expl="3. variant decrease">
<transf name="split_goal_wp">
<goal name="WP_parameter inv_reverse.3.1" expl="1. VC for inv_reverse">
<proof prover="1"><result status="valid" time="0.01" steps="34"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.3.2" expl="2. VC for inv_reverse">
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter inv_reverse.4" expl="4. precondition">
<proof prover="0"><result status="valid" time="0.01"/></proof>
<proof prover="2"><result status="valid" time="0.08"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.5" expl="5. precondition">
<transf name="introduce_premises">
<goal name="WP_parameter inv_reverse.5.1" expl="1. precondition">
<transf name="compute_in_goal">
<goal name="WP_parameter inv_reverse.5.1.1" expl="1. precondition">
<proof prover="1"><result status="valid" time="0.03" steps="295"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter inv_reverse.6" expl="6. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.7" expl="7. precondition">
<proof prover="0"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="6"/></proof>
</goal>
<goal name="WP_parameter inv_reverse.8" expl="8. precondition">
<transf name="introduce_premises">
<goal name="WP_parameter inv_reverse.8.1" expl="1. precondition">
<transf name="compute_in_goal">
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter inv_reverse.9" expl="9. postcondition">
<proof prover="0"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="10"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter empty" expl="VC for empty">
<proof prover="1"><result status="valid" time="0.01" steps="4"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="WP_parameter is_empty" expl="VC for is_empty">
<proof prover="1"><result status="valid" time="0.01" steps="1"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="2"/></proof>
</goal>
<goal name="WP_parameter get_min" expl="VC for get_min">
<transf name="split_goal_wp">
<goal name="WP_parameter get_min.1" expl="1. unreachable point">
<proof prover="1"><result status="valid" time="0.00" steps="3"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="4"/></proof>
</goal>
<goal name="WP_parameter get_min.2" expl="2. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
</goal>
<goal name="WP_parameter get_min.3" expl="3. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="10"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="WP_parameter get_min.4" expl="4. variant decrease">
<proof prover="1"><result status="valid" time="0.00" steps="11"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="12"/></proof>
</goal>
<goal name="WP_parameter get_min.5" expl="5. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="24"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="26"/></proof>
</goal>
<goal name="WP_parameter get_min.6" expl="6. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="27"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="WP_parameter get_min.7" expl="7. postcondition">
<proof prover="0"><result status="valid" time="0.06"/></proof>
......@@ -70,26 +187,26 @@
<proof prover="0"><result status="valid" time="0.03"/></proof>
</goal>
<goal name="WP_parameter get_min.11" expl="11. postcondition">
<proof prover="0"><result status="valid" time="0.19"/></proof>
<proof prover="0"><result status="valid" time="0.06"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter add_tree" expl="VC for add_tree">
<transf name="split_goal_wp">
<goal name="WP_parameter add_tree.1" expl="1. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="6"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="WP_parameter add_tree.2" expl="2. postcondition">
<proof prover="1" timelimit="21"><result status="valid" time="0.01" steps="12"/></proof>
<proof prover="1" timelimit="21"><result status="valid" time="0.01" steps="14"/></proof>
</goal>
<goal name="WP_parameter add_tree.3" expl="3. postcondition">
<proof prover="1"><result status="valid" time="0.00" steps="9"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="10"/></proof>
</goal>
<goal name="WP_parameter add_tree.4" expl="4. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="57"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="60"/></proof>
</goal>
<goal name="WP_parameter add_tree.5" expl="5. postcondition">
<proof prover="1" timelimit="21"><result status="valid" time="0.01" steps="42"/></proof>
<proof prover="1" timelimit="21"><result status="valid" time="0.01" steps="45"/></proof>
</goal>
<goal name="WP_parameter add_tree.6" expl="6. postcondition">
<proof prover="0"><result status="valid" time="0.14"/></proof>
......@@ -97,12 +214,12 @@
<goal name="WP_parameter add_tree.7" expl="7. assertion">
<transf name="compute_in_goal">
<goal name="WP_parameter add_tree.7.1" expl="1. assertion">
<proof prover="1"><result status="valid" time="0.05" steps="52"/></proof>
<proof prover="1"><result status="valid" time="0.05" steps="55"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter add_tree.8" expl="8. variant decrease">
<proof prover="1"><result status="valid" time="0.01" steps="14"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="WP_parameter add_tree.9" expl="9. precondition">
<proof prover="0"><result status="valid" time="0.23"/></proof>
......@@ -110,12 +227,12 @@
<goal name="WP_parameter add_tree.10" expl="10. precondition">
<transf name="compute_in_goal">
<goal name="WP_parameter add_tree.10.1" expl="1. precondition">
<proof prover="1"><result status="valid" time="0.21" steps="1046"/></proof>
<proof prover="1"><result status="valid" time="0.37" steps="1339"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter add_tree.11" expl="11. precondition">
<proof prover="1"><result status="valid" time="0.02" steps="70"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="72"/></proof>
</goal>
<goal name="WP_parameter add_tree.12" expl="12. precondition">
<proof prover="0"><result status="valid" time="0.07"/></proof>
......@@ -133,116 +250,115 @@
</goal>
<goal name="WP_parameter add" expl="VC for add">
<proof prover="0"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="157"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="171"/></proof>
</goal>
<goal name="WP_parameter merge" expl="VC for merge">
<transf name="split_goal_wp">
<goal name="WP_parameter merge.1" expl="1. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.2" expl="2. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.3" expl="3. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="9"/></proof>
</goal>
<goal name="WP_parameter merge.4" expl="4. postcondition">
<proof prover="1"><result status="valid" time="0.00" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.5" expl="5. postcondition">
<proof prover="1"><result status="valid" time="0.00" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.6" expl="6. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="9"/></proof>
</goal>
<goal name="WP_parameter merge.7" expl="7. postcondition">
<proof prover="1"><result status="valid" time="0.00" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.8" expl="8. postcondition">
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
</goal>
<goal name="WP_parameter merge.9" expl="9. postcondition">
<transf name="compute_in_goal">
<goal name="WP_parameter merge.9.1" expl="1. postcondition">
<proof prover="0"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="51"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="52"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter merge.10" expl="10. variant decrease">
<proof prover="1"><result status="valid" time="0.01" steps="13"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="14"/></proof>
</goal>
<goal name="WP_parameter merge.11" expl="11. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="57"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="59"/></proof>
</goal>
<goal name="WP_parameter merge.12" expl="12. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="22"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="WP_parameter merge.13" expl="13. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="8"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="9"/></proof>
</goal>
<goal name="WP_parameter merge.14" expl="14. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="41"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="46"/></proof>
</goal>
<goal name="WP_parameter merge.15" expl="15. postcondition">
<proof prover="0"><result status="valid" time="0.03"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="121"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="82"/></proof>
</goal>
<goal name="WP_parameter merge.16" expl="16. postcondition">
<proof prover="1"><result status="valid" time="0.02" steps="51"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="55"/></proof>
</goal>
<goal name="WP_parameter merge.17" expl="17. postcondition">
<proof prover="1"><result status="valid" time="0.07" steps="159"/></proof>
<proof prover="1"><result status="valid" time="0.07" steps="90"/></proof>
</goal>
<goal name="WP_parameter merge.18" expl="18. variant decrease">
<proof prover="1"><result status="valid" time="0.01" steps="18"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
<goal name="WP_parameter merge.19" expl="19. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="9"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="10"/></proof>
</goal>
<goal name="WP_parameter merge.20" expl="20. precondition">
<proof prover="1"><result status="valid" time="0.01" steps="42"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="47"/></proof>
</goal>
<goal name="WP_parameter merge.21" expl="21. precondition">
<transf name="compute_in_goal">
<goal name="WP_parameter merge.21.1" expl="1. precondition">
<proof prover="1"><result status="valid" time="0.03" steps="451"/></proof>
<proof prover="1"><result status="valid" time="0.03" steps="464"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter merge.22" expl="22. precondition">
<proof prover="1"><result status="valid" time="0.00" steps="23"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="26"/></proof>
</goal>
<goal name="WP_parameter merge.23" expl="23. postcondition">
<proof prover="0"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="122"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="83"/></proof>
</goal>
<goal name="WP_parameter merge.24" expl="24. postcondition">