generate_all_trees: no duplicate elements

parent b4324d3c
......@@ -5,8 +5,7 @@
Given n, the program return an array a of size n+1 such that
a[i] contains the list of all binary trees of size i.
TODO: - show that there is no duplicate in a[i]
- tail-recursive version of combine
TODO: tail-recursive version of combine
*)
module GenerateAllTrees
......@@ -15,6 +14,7 @@ module GenerateAllTrees
use import list.List
use import list.Mem
use import list.Append
use import list.Distinct
use import module array.Array
type tree = Empty | Node tree tree
......@@ -31,35 +31,43 @@ module GenerateAllTrees
exists l r: tree. t = Node l r /\ size l < size t
predicate all_trees (n: int) (l: list tree) =
distinct l /\
forall t: tree. size t = n <-> mem t l
lemma all_trees_0: all_trees 0 (Cons Empty Nil)
lemma tree_diff:
forall l1 l2: tree. size l1 <> size l2 ->
forall r1 r2: tree. Node l1 r1 <> Node l2 r2
(* combines two lists of trees l1 and l2 into the list of trees
with a left sub-tree from l1 and a right sub-tree from l2 *)
let combine (i1: int) (l1: list tree) (i2: int) (l2: list tree) =
{ 0 <= i1 /\ all_trees i1 l1 /\ 0 <= i2 /\ all_trees i2 l2 }
let rec loop1 (l1: list tree) : list tree =
{ }
{ distinct l1 }
match l1 with
| Nil -> Nil
| Cons t1 l1 ->
let rec loop2 (l2: list tree) : list tree =
{}
{ distinct l2 }
match l2 with
| Nil -> Nil
| Cons t2 l2 -> Cons (Node t1 t2) (loop2 l2)
end
{ forall t:tree. mem t result <->
{ distinct result /\
forall t:tree. mem t result <->
(exists r: tree. t = Node t1 r /\ mem r l2) }
in
loop2 l2 ++ loop1 l1
end
{ forall t:tree. mem t result <->
{ distinct result /\
forall t:tree. mem t result <->
(exists l r: tree. t = Node l r /\ mem l l1 /\ mem r l2) }
in
loop1 l1
{ forall t:tree. mem t result <->
{ distinct result /\
forall t:tree. mem t result <->
(exists l r: tree. t = Node l r /\ size l = i1 /\ size r = i2) }
let all_trees (n: int) =
......@@ -72,6 +80,7 @@ module GenerateAllTrees
for j = 0 to i-1 do
invariant {
(forall k: int. 0 <= k < i -> all_trees k a[k]) /\
distinct a[i] /\
(forall t: tree. mem t a[i] <->
exists l r: tree. t = Node l r /\ size t = i /\ size l < j) }
a[i] <- (combine j a[j] (i-1-j) a[i-1-j]) ++ a[i]
......
(* This file is generated by Why3's Coq driver *)
(* Beware! Only edit allowed sections below *)
Require Import ZArith.
Require Import Rbase.
Definition unit := unit.
Parameter qtmark : Type.
Parameter at1: forall (a:Type), a -> qtmark -> a.
Implicit Arguments at1.
Parameter old: forall (a:Type), a -> a.
Implicit Arguments old.
Inductive list (a:Type) :=
| Nil : list a
| Cons : a -> (list a) -> list a.
Set Contextual Implicit.
Implicit Arguments Nil.
Unset Contextual Implicit.
Implicit Arguments Cons.
Set Implicit Arguments.
Fixpoint mem (a:Type)(x:a) (l:(list a)) {struct l}: Prop :=
match l with
| Nil => False
| (Cons y r) => (x = y) \/ (mem x r)
end.
Unset Implicit Arguments.
Set Implicit Arguments.
Fixpoint infix_plpl (a:Type)(l1:(list a)) (l2:(list a)) {struct l1}: (list
a) :=
match l1 with
| Nil => l2
| (Cons x1 r1) => (Cons x1 (infix_plpl r1 l2))
end.
Unset Implicit Arguments.
Axiom Append_assoc : forall (a:Type), forall (l1:(list a)) (l2:(list a))
(l3:(list a)), ((infix_plpl l1 (infix_plpl l2
l3)) = (infix_plpl (infix_plpl l1 l2) l3)).
Axiom Append_l_nil : forall (a:Type), forall (l:(list a)), ((infix_plpl l
(Nil:(list a))) = l).
Set Implicit Arguments.
Fixpoint length (a:Type)(l:(list a)) {struct l}: Z :=
match l with
| Nil => 0%Z
| (Cons _ r) => (1%Z + (length r))%Z
end.
Unset Implicit Arguments.
Axiom Length_nonnegative : forall (a:Type), forall (l:(list a)),
(0%Z <= (length l))%Z.
Axiom Length_nil : forall (a:Type), forall (l:(list a)),
((length l) = 0%Z) <-> (l = (Nil:(list a))).
Axiom Append_length : forall (a:Type), forall (l1:(list a)) (l2:(list a)),
((length (infix_plpl l1 l2)) = ((length l1) + (length l2))%Z).
Axiom mem_append : forall (a:Type), forall (x:a) (l1:(list a)) (l2:(list a)),
(mem x (infix_plpl l1 l2)) <-> ((mem x l1) \/ (mem x l2)).
Axiom mem_decomp : forall (a:Type), forall (x:a) (l:(list a)), (mem x l) ->
exists l1:(list a), exists l2:(list a), (l = (infix_plpl l1 (Cons x l2))).
Inductive distinct{a:Type} : (list a) -> Prop :=
| distinct_zero : (distinct (Nil:(list a)))
| distinct_one : forall (x:a), (distinct (Cons x (Nil:(list a))))
| distinct_many : forall (x:a) (l:(list a)), (~ (mem x l)) ->
((distinct l) -> (distinct (Cons x l))).
Implicit Arguments distinct.
Axiom distinct_append : forall (a:Type), forall (l1:(list a)) (l2:(list a)),
(distinct l1) -> ((distinct l2) -> ((forall (x:a), (mem x l1) -> ~ (mem x
l2)) -> (distinct (infix_plpl l1 l2)))).
Parameter map : forall (a:Type) (b:Type), Type.
Parameter get: forall (a:Type) (b:Type), (map a b) -> a -> b.
Implicit Arguments get.
Parameter set: forall (a:Type) (b:Type), (map a b) -> a -> b -> (map a b).
Implicit Arguments set.
Axiom Select_eq : forall (a:Type) (b:Type), forall (m:(map a b)),
forall (a1:a) (a2:a), forall (b1:b), (a1 = a2) -> ((get (set m a1 b1)
a2) = b1).
Axiom Select_neq : forall (a:Type) (b:Type), forall (m:(map a b)),
forall (a1:a) (a2:a), forall (b1:b), (~ (a1 = a2)) -> ((get (set m a1 b1)
a2) = (get m a2)).
Parameter const: forall (b:Type) (a:Type), b -> (map a b).
Set Contextual Implicit.
Implicit Arguments const.
Unset Contextual Implicit.
Axiom Const : forall (b:Type) (a:Type), forall (b1:b) (a1:a), ((get (const(
b1):(map a b)) a1) = b1).
Inductive array (a:Type) :=
| mk_array : Z -> (map Z a) -> array a.
Implicit Arguments mk_array.
Definition elts (a:Type)(u:(array a)): (map Z a) :=
match u with
| (mk_array _ elts1) => elts1
end.
Implicit Arguments elts.
Definition length1 (a:Type)(u:(array a)): Z :=
match u with
| (mk_array length2 _) => length2
end.
Implicit Arguments length1.
Definition get1 (a:Type)(a1:(array a)) (i:Z): a := (get (elts a1) i).
Implicit Arguments get1.
Definition set1 (a:Type)(a1:(array a)) (i:Z) (v:a): (array a) :=
match a1 with
| (mk_array xcl0 _) => (mk_array xcl0 (set (elts a1) i v))
end.
Implicit Arguments set1.
Inductive tree :=
| Empty : tree
| Node : tree -> tree -> tree .
Set Implicit Arguments.
Fixpoint size(t:tree) {struct t}: Z :=
match t with
| Empty => 0%Z
| (Node l r) => ((1%Z + (size l))%Z + (size r))%Z
end.
Unset Implicit Arguments.
Axiom size_nonneg : forall (t:tree), (0%Z <= (size t))%Z.
Axiom size_left : forall (t:tree), (0%Z < (size t))%Z -> exists l:tree,
exists r:tree, (t = (Node l r)) /\ ((size l) < (size t))%Z.
Definition all_trees(n:Z) (l:(list tree)): Prop := (distinct l) /\
forall (t:tree), ((size t) = n) <-> (mem t l).
Axiom all_trees_0 : (all_trees 0%Z (Cons Empty (Nil:(list tree)))).
Axiom tree_diff : forall (l1:tree) (l2:tree), (~ ((size l1) = (size l2))) ->
forall (r1:tree) (r2:tree), ~ ((Node l1 r1) = (Node l2 r2)).
(* YOU MAY EDIT THE CONTEXT BELOW *)
(* DO NOT EDIT BELOW *)
Theorem WP_parameter_combine : forall (i1:Z), forall (l1:(list tree)),
forall (i2:Z), forall (l2:(list tree)), ((0%Z <= i1)%Z /\ ((all_trees i1
l1) /\ ((0%Z <= i2)%Z /\ (all_trees i2 l2)))) -> forall (l11:(list tree)),
(distinct l11) ->
match l11 with
| Nil => True
| (Cons t1 l12) => forall (l21:(list tree)), (distinct l21) ->
match l21 with
| Nil => True
| (Cons t2 l22) => (distinct l22) -> forall (result:(list tree)),
((distinct result) /\ forall (t:tree), (mem t result) <->
exists r:tree, (t = (Node t1 r)) /\ (mem r l22)) ->
forall (t:tree), (mem t (Cons (Node t1 t2) result)) ->
exists r:tree, (t = (Node t1 r)) /\ (mem r l21)
end
end.
(* YOU MAY EDIT THE PROOF BELOW *)
intuition.
destruct l11; intuition.
destruct l21; intuition.
unfold mem in H6; fold mem in H6.
destruct H6.
exists t0; intuition.
red; intuition.
generalize (H8 t1); clear H8. intuition.
destruct H8 as (r,h); exists r; intuition.
red; intuition.
Qed.
(* DO NOT EDIT BELOW *)
......@@ -69,6 +69,17 @@ Axiom mem_append : forall (a:Type), forall (x:a) (l1:(list a)) (l2:(list a)),
Axiom mem_decomp : forall (a:Type), forall (x:a) (l:(list a)), (mem x l) ->
exists l1:(list a), exists l2:(list a), (l = (infix_plpl l1 (Cons x l2))).
Inductive distinct{a:Type} : (list a) -> Prop :=
| distinct_zero : (distinct (Nil:(list a)))
| distinct_one : forall (x:a), (distinct (Cons x (Nil:(list a))))
| distinct_many : forall (x:a) (l:(list a)), (~ (mem x l)) ->
((distinct l) -> (distinct (Cons x l))).
Implicit Arguments distinct.
Axiom distinct_append : forall (a:Type), forall (l1:(list a)) (l2:(list a)),
(distinct l1) -> ((distinct l2) -> ((forall (x:a), (mem x l1) -> ~ (mem x
l2)) -> (distinct (infix_plpl l1 l2)))).
Parameter map : forall (a:Type) (b:Type), Type.
Parameter get: forall (a:Type) (b:Type), (map a b) -> a -> b.
......@@ -135,8 +146,11 @@ Unset Implicit Arguments.
Axiom size_nonneg : forall (t:tree), (0%Z <= (size t))%Z.
Definition all_trees(n:Z) (l:(list tree)): Prop := forall (t:tree),
((size t) = n) <-> (mem t l).
Axiom size_left : forall (t:tree), (0%Z < (size t))%Z -> exists l:tree,
exists r:tree, (t = (Node l r)) /\ ((size l) < (size t))%Z.
Definition all_trees(n:Z) (l:(list tree)): Prop := (distinct l) /\
forall (t:tree), ((size t) = n) <-> (mem t l).
(* YOU MAY EDIT THE CONTEXT BELOW *)
......@@ -145,6 +159,7 @@ Definition all_trees(n:Z) (l:(list tree)): Prop := forall (t:tree),
Theorem all_trees_0 : (all_trees 0%Z (Cons Empty (Nil:(list tree)))).
(* YOU MAY EDIT THE PROOF BELOW *)
red; intuition.
apply distinct_one.
destruct t; simpl; auto.
unfold size in H; fold size in H.
right; generalize (size_nonneg t1); generalize (size_nonneg t2); omega.
......
......@@ -36,7 +36,7 @@
expanded="true">
<goal
name="size_nonneg"
sum="156445ef5ef8c4b3be9028fb0a504302"
sum="6de904bb3d3aad226f1e059eee2997df"
proved="true"
expanded="true"
shape="ainfix >=asizeV0c0F">
......@@ -45,12 +45,12 @@
timelimit="10"
edited="generate_all_trees_WP_GenerateAllTrees_size_nonneg_1.v"
obsolete="false">
<result status="valid" time="0.47"/>
<result status="valid" time="0.49"/>
</proof>
</goal>
<goal
name="size_left"
sum="391c3e8fcb36f33bfc7f2cafbad2ff8e"
sum="c249b43e22ee41652845930f4cd1bf78"
proved="true"
expanded="true"
shape="ainfix <asizeV1asizeV0Aainfix =V0aNodeV1V2EIainfix >asizeV0c0F">
......@@ -64,7 +64,7 @@
</goal>
<goal
name="all_trees_0"
sum="163ba1acf3e63b8095ef53144b7c3b3e"
sum="4715ef19e47bc152638a13d9cd7a7d6b"
proved="true"
expanded="true"
shape="aall_treesc0aConsaEmptyaNil">
......@@ -76,39 +76,79 @@
<result status="valid" time="0.48"/>
</proof>
</goal>
<goal
name="tree_diff"
sum="73d3650e7204a4dab100141b097e05b3"
proved="true"
expanded="true"
shape="ainfix =aNodeV0V2aNodeV1V3NFIainfix =asizeV0asizeV1NF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.02"/>
</proof>
</goal>
<goal
name="WP_parameter combine"
expl="parameter combine"
sum="d406394db26b8e2560a451321b056992"
sum="0caec2220796b4c699580b1f998e5369"
proved="true"
expanded="true"
shape="CV4aNilamemV7V3AamemV6V4Aainfix =V5aNodeV6V7EqamemV5aNilFaConsVVCV10aNilamemV12V10Aainfix =V11aNodeV8V12EqamemV11aNilFaConsVVamemV17V10Aainfix =V16aNodeV8V17EqamemV16aConsaNodeV8V13V15FIamemV19V14Aainfix =V18aNodeV8V19EqamemV18V15FFFAamemV24V3AamemV23V4Aainfix =V22aNodeV23V24EqamemV22ainfix ++V20V21FIamemV27V3AamemV26V9Aainfix =V25aNodeV26V27EqamemV25V21FFIamemV29V3Aainfix =V28aNodeV8V29EqamemV28V20FFFAainfix =asizeV33V2Aainfix =asizeV32V0Aainfix =V31aNodeV32V33EqamemV31V30FIamemV36V3AamemV35V1Aainfix =V34aNodeV35V36EqamemV34V30FFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="CV4aNilamemV7V3AamemV6V4Aainfix =V5aNodeV6V7EqamemV5aNilFAadistinctaNilaConsVVCV10aNilamemV12V10Aainfix =V11aNodeV8V12EqamemV11aNilFAadistinctaNilaConsVVamemV17V10Aainfix =V16aNodeV8V17EqamemV16aConsaNodeV8V13V15FAadistinctaConsaNodeV8V13V15IamemV19V14Aainfix =V18aNodeV8V19EqamemV18V15FAadistinctV15FAadistinctV14IadistinctV10FAamemV24V3AamemV23V4Aainfix =V22aNodeV23V24EqamemV22ainfix ++V20V21FAadistinctainfix ++V20V21IamemV27V3AamemV26V9Aainfix =V25aNodeV26V27EqamemV25V21FAadistinctV21FAadistinctV9IamemV29V3Aainfix =V28aNodeV8V29EqamemV28V20FAadistinctV20FAadistinctV3IadistinctV4FAainfix =asizeV33V2Aainfix =asizeV32V0Aainfix =V31aNodeV32V33EqamemV31V30FAadistinctV30IamemV36V3AamemV35V1Aainfix =V34aNodeV35V36EqamemV34V30FAadistinctV30FAadistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<transf
name="split_goal"
proved="true"
expanded="true">
<goal
name="WP_parameter combine.1"
expl="normal postcondition"
sum="affcd1a759f2503ee334d059ebc1eb75"
expl="precondition"
sum="9866051da5106406880eaefa7fffd1fb"
proved="true"
expanded="true"
shape="ainfix =asizeV7V2Aainfix =asizeV6V0Aainfix =V5aNodeV6V7EqamemV5V4FIamemV10V3AamemV9V1Aainfix =V8aNodeV9V10EqamemV8V4FFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="adistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.03"/>
<result status="valid" time="0.00"/>
</proof>
</goal>
<goal
name="WP_parameter combine.2"
expl="normal postcondition"
sum="0fd36ff169011cfb08e0eaed3c1a3d8f"
proved="true"
expanded="true"
shape="ainfix =asizeV7V2Aainfix =asizeV6V0Aainfix =V5aNodeV6V7EqamemV5V4FAadistinctV4IamemV10V3AamemV9V1Aainfix =V8aNodeV9V10EqamemV8V4FAadistinctV4FIadistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<transf
name="split_goal"
proved="true"
expanded="true">
<goal
name="WP_parameter combine.2.1"
expl="parameter combine"
sum="d6be72ec59c784189250c702db80561b"
sum="95ba6bbaebbef7cd45368045d7d48c4d"
proved="true"
expanded="true"
shape="CV4aNilamemV7V3AamemV6V4Aainfix =V5aNodeV6V7EqamemV5aNilFaConsVVtFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="adistinctV4IamemV7V3AamemV6V1Aainfix =V5aNodeV6V7EqamemV5V4FAadistinctV4FIadistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.01"/>
</proof>
</goal>
<goal
name="WP_parameter combine.2.2"
expl="parameter combine"
sum="90be46adcd20d4f32bee19032e475ec5"
proved="true"
expanded="true"
shape="ainfix =asizeV7V2Aainfix =asizeV6V0Aainfix =V5aNodeV6V7EIamemV5V4FIamemV10V3AamemV9V1Aainfix =V8aNodeV9V10EqamemV8V4FAadistinctV4FIadistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
......@@ -117,88 +157,223 @@
<result status="valid" time="0.04"/>
</proof>
</goal>
<goal
name="WP_parameter combine.2.3"
expl="parameter combine"
sum="9ac6c1966c5d5b5843613e981f77a0f4"
proved="true"
expanded="true"
shape="amemV5V4Iainfix =asizeV7V2Aainfix =asizeV6V0Aainfix =V5aNodeV6V7EFIamemV10V3AamemV9V1Aainfix =V8aNodeV9V10EqamemV8V4FAadistinctV4FIadistinctV1Iaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.03"/>
</proof>
</goal>
</transf>
</goal>
<goal
name="WP_parameter combine.3"
expl="parameter combine"
sum="57848e3c5a069d2e362706c1f4b9b0a3"
sum="1f0092ff525ea8a6affd9c631faebb22"
proved="true"
expanded="true"
shape="CV4aNilamemV7V3AamemV6V4Aainfix =V5aNodeV6V7EqamemV5aNilFAadistinctaNilaConsVVtIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.04"/>
</proof>
</goal>
<goal
name="WP_parameter combine.4"
expl="parameter combine"
sum="2e644c59922c3e22228b9ea0b3685f58"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.03"/>
</proof>
</goal>
<goal
name="WP_parameter combine.5"
expl="parameter combine"
sum="08ca198bc09790ce8bf54a81a5f9674d"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EqamemV9ainfix ++V7V8FIamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FFIamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FFFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="CV4aNiltaConsVVadistinctV6IamemV9V3Aainfix =V8aNodeV5V9EqamemV8V7FAadistinctV7FIadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.30"/>
</proof>
</goal>
<goal
name="WP_parameter combine.6"
expl="parameter combine"
sum="773b766ea1a3fbd57fad4f214b6cf0e9"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EqamemV9ainfix ++V7V8FAadistinctainfix ++V7V8IamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FAadistinctV8FIadistinctV6IamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FAadistinctV7FIadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<transf
name="split_goal"
proved="true"
expanded="true">
<goal
name="WP_parameter combine.3.1"
name="WP_parameter combine.6.1"
expl="parameter combine"
sum="bb429c722ed4a2354f2f11d1a4f43f4c"
sum="2270199b00ce816da98b1c1df43bfe5c"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EIamemV9ainfix ++V7V8FIamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FFIamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FFFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="CV4aNiltaConsVVadistinctainfix ++V7V8IamemV11V3AamemV10V6Aainfix =V9aNodeV10V11EqamemV9V8FAadistinctV8FIadistinctV6IamemV13V3Aainfix =V12aNodeV5V13EqamemV12V7FAadistinctV7FIadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="3.65"/>
</proof>
</goal>
<goal
name="WP_parameter combine.6.2"
expl="parameter combine"
sum="385cb84813b7bf624e30ae879a477e8a"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EIamemV9ainfix ++V7V8FIamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FAadistinctV8FIadistinctV6IamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FAadistinctV7FIadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="cvc3"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.38"/>
<result status="valid" time="4.74"/>
</proof>
</goal>
<goal
name="WP_parameter combine.3.2"
name="WP_parameter combine.6.3"
expl="parameter combine"
sum="64d22eed0b3456d8b81661a943cce110"
sum="6a68febed58de825e36e17f05827f838"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVamemV9ainfix ++V7V8IamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EFIamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FFIamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FFFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="CV4aNiltaConsVVamemV9ainfix ++V7V8IamemV11V3AamemV10V4Aainfix =V9aNodeV10V11EFIamemV14V3AamemV13V6Aainfix =V12aNodeV13V14EqamemV12V8FAadistinctV8FIadistinctV6IamemV16V3Aainfix =V15aNodeV5V16EqamemV15V7FAadistinctV7FIadistinctV3IadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.10"/>
<result status="valid" time="1.44"/>
</proof>
</goal>
</transf>
</goal>
<goal
name="WP_parameter combine.4"
name="WP_parameter combine.7"
expl="parameter combine"
sum="ad04c73961725f5865b00b397164991f"
sum="c057f27e0d4368bc7bfd650d20dc33fa"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVCV7aNilamemV9V7Aainfix =V8aNodeV5V9EqamemV8aNilFaConsVVtFFIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
shape="CV4aNiltaConsVVCV7aNilamemV9V7Aainfix =V8aNodeV5V9EqamemV8aNilFAadistinctaNilaConsVVtIadistinctV7FIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.03"/>
<result status="valid" time="0.05"/>
</proof>
</goal>
<goal
name="WP_parameter combine.5"
name="WP_parameter combine.8"
expl="parameter combine"
sum="8b8359535d68c61af92ef887c56629d6"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVCV7aNiltaConsVVadistinctV9IadistinctV7FIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="alt-ergo"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="0.74"/>
</proof>
</goal>
<goal
name="WP_parameter combine.9"
expl="parameter combine"
sum="ff72359cd4060afc6e1d0ccee8f1a46f"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVCV7aNiltaConsVVamemV12V7Aainfix =V11aNodeV5V12EqamemV11aConsaNodeV5V8V10FAadistinctaConsaNodeV5V8V10IamemV14V9Aainfix =V13aNodeV5V14EqamemV13V10FAadistinctV10FIadistinctV9IadistinctV7FIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<transf
name="split_goal"
proved="true"
expanded="true">
<goal
name="WP_parameter combine.9.1"
expl="parameter combine"
sum="c909af03eab3980b8c3e7148803b59fe"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVCV7aNiltaConsVVadistinctaConsaNodeV5V8V10IamemV12V9Aainfix =V11aNodeV5V12EqamemV11V10FAadistinctV10FIadistinctV9IadistinctV7FIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="cvc3"
timelimit="10"
edited=""
obsolete="false">
<result status="valid" time="1.52"/>
</proof>
</goal>
<goal
name="WP_parameter combine.9.2"
expl="parameter combine"
sum="3c5ed0e265bd77e4a229a7fb1e7ceb59"
proved="true"
expanded="true"
shape="CV4aNiltaConsVVCV7aNiltaConsVVamemV12V7Aainfix =V11aNodeV5V12EIamemV11aConsaNodeV5V8V10FIamemV14V9Aainfix =V13aNodeV5V14EqamemV13V10FAadistinctV10FIadistinctV9IadistinctV7FIadistinctV4FIaall_treesV2V3Aainfix <=c0V2Aaall_treesV0V1Aainfix <=c0V0FFFF">
<proof
prover="coq"
timelimit="10"
edited="generate_all_trees_WP_GenerateAllTrees_WP_parameter_combine_2.v"
obsolete="false">
<result status="valid" time="0.50"/>
</proof>
</goal>
<goal
name="WP_parameter combine.9.3"
expl="parameter combine"
sum="f24a85046e19e3820a3d69ffae3ee960"