From c5298e08674320b42335a321d0f46d7bff4ad161 Mon Sep 17 00:00:00 2001 From: lukstafi Date: Fri, 20 Feb 2015 00:03:48 +0100 Subject: [PATCH] Special-case numerical abduction heuristic settings for definitions with positive assertions, i.e. `assert num` and `assert type`. Update of tests and documentation. --- doc/invargent-manual.pdf | Bin 173284 -> 175420 bytes doc/invargent-manual.tm | 99 +++++++++------- examples/avl_tree.gadti.target | 4 +- examples/liquid_gauss2.gadt | 112 ++++++++++++++++++ examples/liquid_gauss2.gadti.target | 74 ++++++++++++ examples/liquid_gauss_asserted.gadti.target | 74 ++++++++++++ .../liquid_gauss_harder_asserted.gadti.target | 74 ++++++++++++ ...liquid_gauss_simpler_asserted.gadti.target | 74 ++++++++++++ examples/liquid_tower_harder.gadti.target | 10 +- src/Infer.ml | 14 ++- src/Infer.mli | 5 +- src/InvarGenT.ml | 18 ++- src/InvarGenTTest.ml | 16 ++- src/Invariants.ml | 16 ++- src/Invariants.mli | 9 +- src/InvariantsTest.ml | 13 +- 16 files changed, 538 insertions(+), 74 deletions(-) create mode 100644 examples/liquid_gauss2.gadt create mode 100644 examples/liquid_gauss2.gadti.target create mode 100644 examples/liquid_gauss_asserted.gadti.target create mode 100644 examples/liquid_gauss_harder_asserted.gadti.target create mode 100644 examples/liquid_gauss_simpler_asserted.gadti.target diff --git a/doc/invargent-manual.pdf b/doc/invargent-manual.pdf index a242d84697d131fe78aead337610482b7d58d142..40a260069413d96da49514d8979170afb7d47e9f 100644 GIT binary patch delta 73038 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 delta 70819 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 iteration at which to start + truncating postconditions by only keeping atoms present in the previous + iteration, to force convergence (default 8). + >Include postconditions from recursive calls in abduction from the start. We do not derive requirements put on postconditions by recursive calls on first iteration. @@ -853,6 +857,10 @@ will pick an answer , which in the following step will force an answer , then , etc. + >How much to reward introducing a + constraint on so-far unconstrained varialbe, or penalize if negative + (default 2). + >How much to penalize an abduction candidate inequality for complexity of its coefficients; the coefficient of either the linear or power scaling of the coefficients (default 2.5). @@ -879,6 +887,12 @@ constant 1. This corresponds to an upper bound of an index into a zero-indexed array/matrix/etc. + >Do not treat definitions with + positive assertions (, ) + specially. The special treatment is currently equivalent to passing + reward_constrn -1> and + . + >Penalize abductive guess when the supporting argument comes from the partial answer, instead of from the current premise (default 4). Guesses involving the partial answer are @@ -1004,8 +1018,8 @@ file. - Let us have a look at test-suite examples that need a non-default parameter - setting. + Let us have a look at tests from the direcotory that + need a non-default parameter setting. <\code> $ ./invargent -inform examples/non_pointwise_leq.gadt @@ -1017,7 +1031,7 @@ \; Perhaps increase the -iterations_timeout parameter or try the - -more_existential option. + -more_existential option or -prefer_guess option. $ ./invargent -inform -prefer_guess examples/non_pointwise_leq.gadt @@ -1037,47 +1051,52 @@ . On the other hand, is inferred with default settings. + The response from the system does not always include an option which would + make the inference succeed. + <\code> - $ ./invargent -inform examples/liquid_heapsort_heapify_simpler.gadt + $ ./invargent -inform examples/liquid_simplex_step_3a.gadt + + File "examples/liquid_simplex_step_3a.gadt", line 7, characters 49-1651: - val heapify : + No answer in type: Answers do not converge - \ \ >k, n, a[0 > n > n + - 1 > k]. + \; - \ \ Num k > Array (a, k) > Num n - > () + Perhaps do not pass the -no_dead_code flag. - InvarGenT: Generated file examples/liquid_heapsort_heapify_simpler.gadti + Perhaps increase the -iterations_timeout parameter or try one of the + options: -more_existential, -prefer_guess, + -prefer_bound_to_local. - InvarGenT: Generated file examples/liquid_heapsort_heapify_simpler.ml + Perhaps some definition is used with requirements on - InvarGenT: Command "ocamlc -w -25 -c examples/liquid_heapsort_heapify_simpler.ml" - exited with code 0 + its inferred postcondition not warranted by the definition. - $ ./invargent -inform -prefer_bound_to_local \\ - examples/liquid_heapsort_heapify_simpler.gadt + $ ./invargent -inform -prefer_bound_to_local -only_off_by_1 \\ - val heapify : + examples/liquid_simplex_step_3a.gadt - \ \ >i, k, n, a[0 > n > - n + 1 > i > i > k]. + val main_step3_test : >k, n[1 > n + > 3 > k]. Matrix (n, k) + > Float - \ \ Num i > Array (a, k) > Num n - > () + InvarGenT: Generated file examples/liquid_simplex_step_3a.gadti - InvarGenT: Generated file examples/liquid_heapsort_heapify_simpler.gadti + InvarGenT: Generated file examples/liquid_simplex_step_3a.ml - InvarGenT: Generated file examples/liquid_heapsort_heapify_simpler.ml + File "examples/liquid_simplex_step_3a.ml", line 43, characters 8-9: - InvarGenT: Command "ocamlc -w -25 -c examples/liquid_heapsort_heapify_simpler.ml" + Warning 26: unused variable m. + + InvarGenT: Command "ocamlc -w -25 -c examples/liquid_simplex_step_3a.ml" exited with code 0 - Above, the type inferred with default parameter setting is insufficiently - general. Other examples that need the - option: , - . + The other examples that need the option, + but not the only_off_by_1> option: + , + . <\code> $ ./invargent -inform examples/pointwise_zip2_harder.gadt @@ -1322,14 +1341,8 @@ n + 1].Num n> instead of >k[k > n > 0 > k + 1].Num k>. The inference of the intended type succeeds after we introduce an appropriate assertion, - e.g. . - - The example creates too complex an - abduction problem at a late iteration of the type inference problem. - Paradoxically, the example is harder than , - despite the latter performing a joint inference of all the functions. The - example leads to more parameter sharing and - thus easier abduction problems. + e.g. . Alternatively, we could include a use + case for where the full postcondition is required. Examples , and @@ -1357,14 +1370,16 @@ intended postcondition. The example poses too big a challenge - for InvarGenT. To get the example that passes - inference, we needed to modify it in two ways. One was streamlining one of - the nested definitions, to not introduce another, unnecessary level of - nesting. The other was to relax the constraint on the processed portion of - the matrix, coming from the restriction on the matrix size intended in the - original source of the example. In + for InvarGenT. To get it pass the inference, we streamline one of the + nested definitions, to not introduce another, unnecessary level of nesting. + This gives the example , which needs to be run + with the option . Additionally, we can + relax the constraint on the processed portion of the matrix, coming from + the restriction on the matrix size intended in the original source of the + example. In , the whole matrix is processed and the - inferred type is most general. + inferred type is most general, under the default settings -- no need to + pass any options to InvarGenT. <\initial> diff --git a/examples/avl_tree.gadti.target b/examples/avl_tree.gadti.target index d022904..5f82172 100644 --- a/examples/avl_tree.gadti.target +++ b/examples/avl_tree.gadti.target @@ -50,9 +50,9 @@ val remove_min_binding : val merge : ∀k, n, a[n ≤ k + 2 ∧ k ≤ n + 2]. - (Avl (a, n), Avl (a, k)) → ∃i[n ≤ i ∧ i ≤ n + k ∧ k ≤ i ∧ + (Avl (a, n), Avl (a, k)) → ∃i[n ≤ i ∧ k ≤ i ∧ i ≤ n + k ∧ i≤max (k + 1, n + 1)].Avl (a, i) val remove : ∀n, a. - a → Avl (a, n) → ∃k[k ≤ n ∧ n ≤ k + 1 ∧ 0 ≤ k].Avl (a, k) + a → Avl (a, n) → ∃k[n ≤ k + 1 ∧ 0 ≤ k ∧ k ≤ n].Avl (a, k) diff --git a/examples/liquid_gauss2.gadt b/examples/liquid_gauss2.gadt new file mode 100644 index 0000000..4de36f8 --- /dev/null +++ b/examples/liquid_gauss2.gadt @@ -0,0 +1,112 @@ +external type Matrix : num * num = + "(float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array2.t" +external let matrix_make : + ∀n, k [0≤n ∧ 0≤k]. Num n → Num k → Matrix (n, k) = + "fun a b -> Bigarray.Array2.create Bigarray.float64 Bigarray.c_layout a b" +external let matrix_get : + ∀n, k, i, j [0≤i ∧ i+1≤n ∧ 0≤j ∧ j+1≤k]. + Matrix (n, k) → Num i → Num j → Float = "Bigarray.Array2.get" +external let matrix_set : + ∀n, k, i, j [0≤i ∧ i+1≤n ∧ 0≤j ∧ j+1≤k]. + Matrix (n, k) → Num i → Num j → Float → () = "Bigarray.Array2.set" +external let matrix_dim1 : + ∀n, k [0≤n ∧ 0≤k]. Matrix (n, k) → Num n = "Bigarray.Array2.dim1" +external let matrix_dim2 : + ∀n, k [0≤n ∧ 0≤k]. Matrix (n, k) → Num k = "Bigarray.Array2.dim2" + +datatype Array : type * num +external let array_make : + ∀n, a [0≤n]. Num n → a → Array (a, n) = "fun a b -> Array.make a b" +external let array_get : + ∀n, k, a [0≤k ∧ k+1≤n]. Array (a, n) → Num k → a = "fun a b -> Array.get a b" +external let array_set : + ∀n, k, a [0≤k ∧ k+1≤n]. Array (a, n) → Num k → a → () = + "fun a b c -> Array.set a b c" +external let array_length : + ∀n, a [0≤n]. Array (a, n) → Num n = "fun a -> Array.length a" + +external let n2f : ∀n. Num n → Float = "float_of_int" +external let equal : ∀a. a → a → Bool = "fun x y -> x = y" +external let leq : ∀a. a → a → Bool = "fun x y -> x <= y" +external let less : ∀a. a → a → Bool = "fun x y -> x < y" + +external let minus : Float → Float → Float = "(-.)" +external let plus : Float → Float → Float = "(+.)" +external let mult : Float → Float → Float = "( *. )" +external let div : Float → Float → Float = "( /. )" +external let fabs : Float → Float = "abs_float" +external let fl0 : Float = "0.0" +external let fl1 : Float = "1.0" + +let getRow data i = + let stride = matrix_dim2 data in + let rowData = array_make stride fl0 in + let rec extract j = + if j + 1 <= stride then ( + array_set rowData j (matrix_get data i j); + (* lukstafi: the call below missing in the original source? *) + extract (j + 1)) + else () in + extract 0; + rowData + +let putRow data i row = + let stride = array_length row in + let rec put j = + if j + 1 <= stride then ( + matrix_set data i j (array_get row j); + (* lukstafi: the call below missing in the original source? *) + put (j + 1)) + else () in + put 0 + +let rowSwap data i j = + let temp = getRow data i in + putRow data i (getRow data j); + putRow data j temp + +let norm r n i = + let x = array_get r i in + array_set r i fl1; + let rec loop k = + if k + 1 <= n then ( + array_set r k (div (array_get r k) x); + loop (k+1)) + else () in + loop (i+1) + +let rowElim r s n i = + let x = array_get s i in + array_set s i fl0; + let rec loop k = + if k + 1 <= n then ( + array_set s k (minus (array_get s k) (mult x (array_get r k))); + loop (k+1)) + else () in + loop (i+1) + +let gauss data = + let n = matrix_dim1 data in + + let rec rowMax i j x mx = + eif j + 1 <= n then + let y = fabs (matrix_get data j i) in + eif (less x y) then rowMax i (j+1) y j + else rowMax i (j+1) x mx + else mx in + + let rec loop1 i = + if i + 1 <= n then + let x = fabs (matrix_get data i i) in + let mx = rowMax i (i+1) x i in + norm (getRow data mx) (n+1) i; + rowSwap data i mx; + let rec loop2 j = + if j + 1 <= n then ( + rowElim (getRow data i) (getRow data j) (n+1) i; + loop2 (j+1)) + else () in + loop2 (i+1); + loop1 (i+1) + else () in + loop1 0 diff --git a/examples/liquid_gauss2.gadti.target b/examples/liquid_gauss2.gadti.target new file mode 100644 index 0000000..2ece992 --- /dev/null +++ b/examples/liquid_gauss2.gadti.target @@ -0,0 +1,74 @@ +external type Matrix : num * num + +external val matrix_make : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Num n → Num k → Matrix (n, k) + +external val matrix_get : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float + +external val matrix_set : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float → () + +external val matrix_dim1 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num n + +external val matrix_dim2 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num k + +datatype Array : type * num + +external val array_make : ∀n, a[0 ≤ n]. Num n → a → Array (a, n) + +external val array_get : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a + +external val array_set : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a → () + +external val array_length : ∀n, a[0 ≤ n]. Array (a, n) → Num n + +external val n2f : ∀n. Num n → Float + +external val equal : ∀a. a → a → Bool + +external val leq : ∀a. a → a → Bool + +external val less : ∀a. a → a → Bool + +external val minus : Float → Float → Float + +external val plus : Float → Float → Float + +external val mult : Float → Float → Float + +external val div : Float → Float → Float + +external val fabs : Float → Float + +external val fl0 : Float + +external val fl1 : Float + +val getRow : + ∀i, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i]. + Matrix (i, n) → Num k → Array (Float, n) + +val putRow : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n ≤ j]. + Matrix (i, j) → Num k → Array (Float, n) → () + +val rowSwap : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n + 1 ≤ i ∧ + 0 ≤ j]. Matrix (i, j) → Num k → Num n → () + +val norm : + ∀i, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i]. + Array (Float, i) → Num k → Num n → () + +val rowElim : + ∀i, j, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i ∧ k ≤ j]. + Array (Float, j) → Array (Float, i) → Num k → Num n → () + +val gauss : ∀k, n[1 ≤ n ∧ n + 1 ≤ k]. Matrix (n, k) → () diff --git a/examples/liquid_gauss_asserted.gadti.target b/examples/liquid_gauss_asserted.gadti.target new file mode 100644 index 0000000..caa45d5 --- /dev/null +++ b/examples/liquid_gauss_asserted.gadti.target @@ -0,0 +1,74 @@ +external type Matrix : num * num + +external val matrix_make : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Num n → Num k → Matrix (n, k) + +external val matrix_get : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float + +external val matrix_set : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float → () + +external val matrix_dim1 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num n + +external val matrix_dim2 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num k + +datatype Array : type * num + +external val array_make : ∀n, a[0 ≤ n]. Num n → a → Array (a, n) + +external val array_get : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a + +external val array_set : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a → () + +external val array_length : ∀n, a[0 ≤ n]. Array (a, n) → Num n + +external val n2f : ∀n. Num n → Float + +external val equal : ∀a. a → a → Bool + +external val leq : ∀a. a → a → Bool + +external val less : ∀a. a → a → Bool + +external val minus : Float → Float → Float + +external val plus : Float → Float → Float + +external val mult : Float → Float → Float + +external val div : Float → Float → Float + +external val fabs : Float → Float + +external val fl0 : Float + +external val fl1 : Float + +val getRow : + ∀i, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i]. + Matrix (i, n) → Num k → Array (Float, n) + +val putRow : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n ≤ j]. + Matrix (i, j) → Num k → Array (Float, n) → () + +val rowSwap : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n + 1 ≤ i ∧ + 0 ≤ j]. Matrix (i, j) → Num k → Num n → () + +val norm : + ∀i, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i]. + Array (Float, i) → Num k → Num n → () + +val rowElim : + ∀i, j, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i ∧ k ≤ j]. + Array (Float, j) → Array (Float, i) → Num k → Num n → () + +val gauss : ∀n[1 ≤ n]. Matrix (n, n + 1) → () diff --git a/examples/liquid_gauss_harder_asserted.gadti.target b/examples/liquid_gauss_harder_asserted.gadti.target new file mode 100644 index 0000000..caa45d5 --- /dev/null +++ b/examples/liquid_gauss_harder_asserted.gadti.target @@ -0,0 +1,74 @@ +external type Matrix : num * num + +external val matrix_make : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Num n → Num k → Matrix (n, k) + +external val matrix_get : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float + +external val matrix_set : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float → () + +external val matrix_dim1 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num n + +external val matrix_dim2 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num k + +datatype Array : type * num + +external val array_make : ∀n, a[0 ≤ n]. Num n → a → Array (a, n) + +external val array_get : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a + +external val array_set : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a → () + +external val array_length : ∀n, a[0 ≤ n]. Array (a, n) → Num n + +external val n2f : ∀n. Num n → Float + +external val equal : ∀a. a → a → Bool + +external val leq : ∀a. a → a → Bool + +external val less : ∀a. a → a → Bool + +external val minus : Float → Float → Float + +external val plus : Float → Float → Float + +external val mult : Float → Float → Float + +external val div : Float → Float → Float + +external val fabs : Float → Float + +external val fl0 : Float + +external val fl1 : Float + +val getRow : + ∀i, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i]. + Matrix (i, n) → Num k → Array (Float, n) + +val putRow : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n ≤ j]. + Matrix (i, j) → Num k → Array (Float, n) → () + +val rowSwap : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n + 1 ≤ i ∧ + 0 ≤ j]. Matrix (i, j) → Num k → Num n → () + +val norm : + ∀i, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i]. + Array (Float, i) → Num k → Num n → () + +val rowElim : + ∀i, j, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i ∧ k ≤ j]. + Array (Float, j) → Array (Float, i) → Num k → Num n → () + +val gauss : ∀n[1 ≤ n]. Matrix (n, n + 1) → () diff --git a/examples/liquid_gauss_simpler_asserted.gadti.target b/examples/liquid_gauss_simpler_asserted.gadti.target new file mode 100644 index 0000000..e536283 --- /dev/null +++ b/examples/liquid_gauss_simpler_asserted.gadti.target @@ -0,0 +1,74 @@ +external type Matrix : num * num + +external val matrix_make : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Num n → Num k → Matrix (n, k) + +external val matrix_get : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float + +external val matrix_set : + ∀n, k, i, j[0 ≤ i ∧ i + 1 ≤ n ∧ 0 ≤ j ∧ j + 1 ≤ k]. + Matrix (n, k) → Num i → Num j → Float → () + +external val matrix_dim1 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num n + +external val matrix_dim2 : + ∀n, k[0 ≤ n ∧ 0 ≤ k]. Matrix (n, k) → Num k + +datatype Array : type * num + +external val array_make : ∀n, a[0 ≤ n]. Num n → a → Array (a, n) + +external val array_get : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a + +external val array_set : + ∀n, k, a[0 ≤ k ∧ k + 1 ≤ n]. Array (a, n) → Num k → a → () + +external val array_length : ∀n, a[0 ≤ n]. Array (a, n) → Num n + +external val n2f : ∀n. Num n → Float + +external val equal : ∀a. a → a → Bool + +external val leq : ∀a. a → a → Bool + +external val less : ∀a. a → a → Bool + +external val minus : Float → Float → Float + +external val plus : Float → Float → Float + +external val mult : Float → Float → Float + +external val div : Float → Float → Float + +external val fabs : Float → Float + +external val fl0 : Float + +external val fl1 : Float + +external getRow : + ∀n, k, i[0 ≤ k ∧ 0 ≤ i ∧ i + 1 ≤ n]. + Matrix (n, k) → Num i → Array (Float, k) + +external putRow : + ∀n, k, i, j[0 ≤ j ∧ 0 ≤ i ∧ i + 1 ≤ n ∧ j ≤ k]. + Matrix (n, k) → Num i → Array (Float, j) → () + +external rowSwap : + ∀i, j, k, n[0 ≤ n ∧ 0 ≤ k ∧ k + 1 ≤ i ∧ n + 1 ≤ i ∧ + 0 ≤ j]. Matrix (i, j) → Num k → Num n → () + +external norm : + ∀i, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i]. + Array (Float, i) → Num k → Num n → () + +external rowElim : + ∀i, j, k, n[0 ≤ n ∧ n + 1 ≤ i ∧ k ≤ i ∧ k ≤ j]. + Array (Float, j) → Array (Float, i) → Num k → Num n → () + +val gauss : ∀n[1 ≤ n]. Matrix (n, n + 1) → () diff --git a/examples/liquid_tower_harder.gadti.target b/examples/liquid_tower_harder.gadti.target index d674c75..dcb20be 100644 --- a/examples/liquid_tower_harder.gadti.target +++ b/examples/liquid_tower_harder.gadti.target @@ -35,11 +35,11 @@ val initialize : ∀k, n[n ≤ k + 1]. Array (Int, k) → Num n → () val showpiece : Int → Int → () val showposts : - ∀i, k, n[i ≤ n + 1 ∧ i ≤ k + 1 ∧ 0 ≤ i]. + ∀i, k, n[1 ≤ k ∧ 0 ≤ i ∧ i ≤ n + 1 ∧ i ≤ k]. Array (Int, i) → Array (Int, k) → Array (Int, n) → () val move : - ∀i, j, k, n[n ≤ m ∧ k ≤ m ∧ i + j ≤ m ∧ i + 1 ≤ m ∧ - j ≤ k ∧ j ≤ n + 1 ∧ 0 ≤ i ∧ 1 ≤ k]. - Num j → Array (Int, m) → Num i → Array (Int, m) → - Num k → Array (Int, m) → Num n → () + ∀i, j, k, m, n[n ≤ k ∧ 1 ≤ i ∧ i ≤ k ∧ 0 ≤ j ∧ + j + 1 ≤ k ∧ 0 ≤ m ∧ m ≤ n + 1 ∧ j + m ≤ k ∧ m ≤ i]. + Num m → Array (Int, k) → Num j → Array (Int, k) → Num i → + Array (Int, k) → Num n → () diff --git a/src/Infer.ml b/src/Infer.ml index 25a0f68..9272a88 100644 --- a/src/Infer.ml +++ b/src/Infer.ml @@ -429,6 +429,8 @@ let impl prem concl = let letin_count = ref 0 +let uses_pos_assertions = ref false + let constr_gen_expr gamma e t = let elim_extype = ref [] and preserve = ref [] in let rec aux gamma t e : cnstrnt * iexpr = @@ -536,6 +538,7 @@ let constr_gen_expr gamma e t = | Letin (_, _, (RuntimeFailure _ as e1), _, _) -> aux gamma t e1 | AssertLeq (e1, e2, e3, loc) -> + uses_pos_assertions := true; let a1 = fresh_var Num_sort in let t1 = TVar a1 in let a2 = fresh_var Num_sort in @@ -552,6 +555,7 @@ let constr_gen_expr gamma e t = Ex (vars_of_list [a1; a2], cn), AssertLeq (e1, e2, e3, loc) | AssertEqty (e1, e2, e3, loc) -> + uses_pos_assertions := true; let a1 = fresh_typ_var () in let t1 = TVar a1 in let a2 = fresh_typ_var () in @@ -998,6 +1002,7 @@ let infer_prog solver prog = let pat_loc = match it with | LetVal (_, PVar (_, lc), _, _, _) -> Some lc | _ -> None in + uses_pos_assertions := false; let chi_id, _, cn, e, tests, elim_cells, preserve = constr_gen_letrec ~nonrec:(pat_loc<>None) !gamma x e sig_cn t tests in @@ -1005,7 +1010,9 @@ let infer_prog solver prog = pr_cnstrnt cn; *]*) let preserve = add_vars preserve (VarSet.union (fvs_typ t) (fvs_formula sig_cn)) in - let q, phi_res, sb_chi = solver ~new_ex_types ~preserve cn in + let q, phi_res, sb_chi = + solver ~uses_pos_assertions:!uses_pos_assertions + ~new_ex_types ~preserve cn in let elim_extypes = concat_map (!) elim_cells in let nice_sb, (vs, phi) = try nice_ans (List.assoc chi_id sb_chi) @@ -1063,6 +1070,7 @@ let infer_prog solver prog = let ta = TVar a in VarSet.singleton a, [], [], ta | Some (vs, phi, t) -> VarSet.empty, vs, phi, t in + uses_pos_assertions := false; let bs, exphi, env, cn, (p, e), elim_cell, preserve = constr_gen_let !gamma p e t in (*[* Format.printf "LetVal: p=%a@\ninit_cn=%a@\n%!" pr_pat p @@ -1077,7 +1085,9 @@ let infer_prog solver prog = if VarSet.is_empty avs then cn else Ex (avs, cn) in (*[* Format.printf "LetVal: p=%a@\ncn=%a@\n%!" pr_pat p pr_cnstrnt cn; *]*) - let q, phi, sb_chi = solver ~new_ex_types ~preserve cn in + let q, phi, sb_chi = solver + ~uses_pos_assertions:!uses_pos_assertions + ~new_ex_types ~preserve cn in let elim_extypes = !elim_cell in let sb, phi = separate_subst ~bvs:preserve ~apply:true q phi in diff --git a/src/Infer.mli b/src/Infer.mli index 899473d..bf443bb 100644 --- a/src/Infer.mli +++ b/src/Infer.mli @@ -50,8 +50,11 @@ type solution = (int * (Defs.var_name list * Terms.formula)) list val infer_prog_mockup : program -> (int * Defs.loc) list * Defs.VarSet.t * cnstrnt + +(** Exported only for testing purposes. *) +val uses_pos_assertions : bool ref val infer_prog : - (new_ex_types:(int * Defs.loc) list -> + (uses_pos_assertions:bool -> new_ex_types:(int * Defs.loc) list -> preserve:Defs.VarSet.t -> cnstrnt -> solution) -> program -> (string * Terms.typ_scheme) list * Terms.annot_item list diff --git a/src/InvarGenT.ml b/src/InvarGenT.ml index 564ed14..d6aa414 100644 --- a/src/InvarGenT.ml +++ b/src/InvarGenT.ml @@ -14,13 +14,13 @@ open Defs open Terms open Aux -let solver ~new_ex_types ~preserve cn = +let solver ~uses_pos_assertions ~new_ex_types ~preserve cn = let q_ops, cn = Infer.prenexize cn in (*[* Format.printf "solver: cn=@\n%a@\n%!" Infer.pr_cnstrnt cn; *]*) let exty_res_of_chi, brs = Infer.normalize q_ops cn in (*[* Format.printf "solver: normalized=@\n%a@\n%!" Infer.pr_brs brs; *]*) let brs = Infer.simplify preserve q_ops brs in - Invariants.solve q_ops new_ex_types exty_res_of_chi brs + Invariants.solve ~uses_pos_assertions q_ops new_ex_types exty_res_of_chi brs let process_file ?(do_sig=false) ?(do_ml=false) ?(verif_ml=true) ?(full_annot=false) fname = @@ -80,6 +80,8 @@ let main () = and full_annot = ref false in let num_is_mod s = OCaml.num_is := s; OCaml.num_is_mod := true in + let set_convergence_step i = + Invariants.disj_step.(5) <- i in let cli = [ "-inform", Arg.Set Infer.inform_toplevel, "Print type schemes of toplevel definitions as they are inferred"; @@ -114,6 +116,10 @@ let main () = "Do not include alien (e.g. numerical) premise info in term abduction"; "-early_num_abduction", Arg.Set NumS.early_num_abduction, "Include recursive branches in numerical abduction from the start"; + "-convergence_step", Arg.Int set_convergence_step, + "The iteration at which to start truncating postconditions to only \ + keep atoms present in the previous iteration, to force \ + convergence (default 8)"; "-early_postcond_abd", Arg.Set Invariants.early_postcond_abd, "Include postconditions from recursive calls in abduction from the start"; "-num_abduction_rotations", Arg.Set_int NumS.abd_rotations, @@ -147,6 +153,9 @@ let main () = "-only_off_by_1", Arg.Set NumS.only_off_by_1, "Limit the effect of -prefer_bound_to_local and \ -prefer_bound_to_outer to inequalities with a constant 1"; + "-same_with_assertions", Arg.Set Invariants.same_with_assertions, + "Do not treat definitions with positive assertions (assert num, \ + assert type) specially"; "-concl_abd_penalty", Arg.Set_int NumS.concl_abd_penalty, "Penalize abductive guess when the supporting argument comes from \ the partial answer, instead of from the current premise (default 4)"; @@ -214,8 +223,9 @@ let main () = if !NumS.abd_fail_flag then Format.printf "Perhaps increase the -num_abduction_fail parameter.@\n%!"; if !Invariants.timeout_flag then Format.printf - "Perhaps increase the -iterations_timeout parameter or try the \ - -more_existential option.@\n%!"; + "Perhaps increase the -iterations_timeout parameter or try one \ + of the options: \ + -more_existential, -prefer_guess, -prefer_bound_to_local.@\n%!"; if !Invariants.unfinished_postcond_flag then Format.printf "Perhaps some definition is used with requirements on@ its \ inferred postcondition not warranted by the definition.@\n%!"; diff --git a/src/InvarGenTTest.ml b/src/InvarGenTTest.ml index d0f3c5e..66f589b 100644 --- a/src/InvarGenTTest.ml +++ b/src/InvarGenTTest.ml @@ -510,17 +510,15 @@ let tests = "InvarGenT" >::: [ "liquid_tower_asserted" >:: (fun () -> skip_if !debug "debug"; - test_case ~prefer_bound_to_local:true - ~reward_constrn:(-1) "liquid_tower_asserted" ()); + test_case "liquid_tower_asserted" ()); "liquid_tower" >:: (fun () -> skip_if !debug "debug"; test_case "liquid_tower" ()); "liquid_tower_harder" >:: (fun () -> - todo "too hard for current numerical abduction"; skip_if !debug "debug"; - test_case "liquid_tower_harder" ()); + test_case ~prefer_bound_to_local:true "liquid_tower_harder" ()); "liquid_matmult" >:: (fun () -> skip_if !debug "debug"; @@ -528,8 +526,7 @@ let tests = "InvarGenT" >::: [ "liquid_heapsort-heapify-simpler" >:: (fun () -> skip_if !debug "debug"; - test_case ~prefer_bound_to_local:true - "liquid_heapsort_heapify_simpler" ()); + test_case "liquid_heapsort_heapify_simpler" ()); "liquid_heapsort-heapify-simpler2" >:: (fun () -> (* TODO: improve time *) @@ -652,21 +649,22 @@ let tests = "InvarGenT" >::: [ test_case "liquid_gauss_simpler" ()); "liquid_gauss_simpler_asserted" >:: (fun () -> - todo "FIXME"; skip_if !debug "debug"; test_case "liquid_gauss_simpler_asserted" ()); "liquid_gauss" >:: (fun () -> skip_if !debug "debug"; test_case "liquid_gauss" ()); + "liquid_gauss2" >:: + (fun () -> + skip_if !debug "debug"; + test_case ~prefer_bound_to_local:true "liquid_gauss2" ()); "liquid_gauss_asserted" >:: (fun () -> - todo "FIXME"; skip_if !debug "debug"; test_case "liquid_gauss_asserted" ()); "liquid_gauss_harder_asserted" >:: (fun () -> - todo "too hard for current numerical abudction"; skip_if !debug "debug"; test_case "liquid_gauss_harder_asserted" ()); "liquid_gauss_harder" >:: diff --git a/src/Invariants.ml b/src/Invariants.ml index 7e586b3..8468d12 100644 --- a/src/Invariants.ml +++ b/src/Invariants.ml @@ -12,8 +12,9 @@ let timeout_flag = ref false let unfinished_postcond_flag = ref false let use_prior_discards = ref (* false *)true let use_solution_in_postcond = ref false (* true *) +let same_with_assertions = ref false (* Captures where the repeat step is/are. *) -let disj_step = [|1; 1; 2; 3; 4; 6|] +let disj_step = [|1; 1; 2; 3; 4; (* 6 *)8|] open Defs open Terms @@ -843,8 +844,15 @@ let neg_constrns = ref true let empty_disc = {at_typ=[],[]; at_num=[]; at_ord=[]; at_so=()} let empty_dl = {at_typ=[]; at_num=[]; at_ord=[]; at_so=()} -let solve q_ops new_ex_types exty_res_chi brs = +let solve ~uses_pos_assertions q_ops new_ex_types exty_res_chi brs = timeout_flag := false; + let old_reward_constrn = !NumS.reward_constrn in + let old_prefer_bound_to_local = !NumS.prefer_bound_to_local in + (*[* Format.printf + "solve: old_reward_constrn=%d, uses_pos_assertions=%b@\n%!" + old_reward_constrn uses_pos_assertions; *]*) + if uses_pos_assertions && not !same_with_assertions + then (NumS.reward_constrn := -1; NumS.prefer_bound_to_local := true); (* DEBUG *) (*[* List.iter (fun (prem,concl) -> @@ -1808,6 +1816,8 @@ let solve q_ops new_ex_types exty_res_chi brs = (!unfinished_postcond @ unfinished1 @ unfinished2 @ unfinished3) in timeout_flag := true; + NumS.reward_constrn := old_reward_constrn; + NumS.prefer_bound_to_local := old_prefer_bound_to_local; raise (NoAnswer (Type_sort, "Answers do not converge", None, loc)) else finish rol2 sol2 in match loop 0 empty_dl rolT solT [] with @@ -1911,5 +1921,7 @@ let solve q_ops new_ex_types exty_res_chi brs = let ety_n = Extype ex_i in Hashtbl.replace sigma ety_n (VarSet.elements allvs, rphi, [rty], ety_n, pvs)) new_ex_types; + NumS.reward_constrn := old_reward_constrn; + NumS.prefer_bound_to_local := old_prefer_bound_to_local; (*[* Format.printf "solve: returning@\n%!"; *]*) q.op, ans_res, sol diff --git a/src/Invariants.mli b/src/Invariants.mli index 631fca9..886d386 100644 --- a/src/Invariants.mli +++ b/src/Invariants.mli @@ -10,19 +10,26 @@ val timeout_count : int ref val timeout_flag : bool ref val unfinished_postcond_flag : bool ref val use_prior_discards : bool ref +(** If [true], do not use specific heuristic settings for definitions + with assertions. Currently, when [false], {!NumS.reward_constrn} + is set to [-1] for definitions with assertions. *) +val same_with_assertions : bool ref (** Breakdown of steps through the main iteration to achieve convergence, counting from 0. The iteration: * [disj_step.(0)] is * [disj_step.(1)] is * [disj_step.(2)] is - * [disj_step.(3)] is when convergence of postconditions is enforced. + * [disj_step.(3)] is + * [disj_step.(4)] is + * [disj_step.(5)] is when convergence of postconditions is enforced. *) val disj_step : int array type chi_subst = (int * (Defs.var_name list * Terms.formula)) list val neg_constrns : bool ref val solve : + uses_pos_assertions:bool -> Defs.quant_ops -> (int * Defs.loc) list -> (int, int) Hashtbl.t -> (Terms.formula * Terms.formula) list -> Defs.quant_ops * Terms.formula * chi_subst diff --git a/src/InvariantsTest.ml b/src/InvariantsTest.ml index 291d97e..3c0fbbb 100644 --- a/src/InvariantsTest.ml +++ b/src/InvariantsTest.ml @@ -69,7 +69,8 @@ let test_common ?more_general ?more_existential ?no_num_abduction (match prefer_guess with | None -> () | Some prefer_guess -> Abduction.prefer_guess := prefer_guess); let _, res, sol = - Invariants.solve q_ops new_ex_types exty_res_of_chi brs in + Invariants.solve ~uses_pos_assertions:!Infer.uses_pos_assertions + q_ops new_ex_types exty_res_of_chi brs in Defs.nodeadcode := old_nodeadcode; Defs.guess_from_postcond := old_guess_from_postcond; Defs.force_nodeadcode := old_force_nodeadcode; @@ -1900,7 +1901,7 @@ let rec zip = | UCons xs, UCons ys -> let zs = zip (xs, ys) in UCons zs" - [2,"∃n, k. δ = ((Unary n, Unary k) → ∃i[i=min (k, n)].Unary i)"] + [2,"∃n, k. δ = ((Unary n, Unary k) → ∃i[i=min (n, k)].Unary i)"] ); "unary minimum asserted 1" >:: @@ -1963,7 +1964,7 @@ let rec zip = | UCons xs, UCons ys -> let zs = zip (xs, ys) in UCons zs" - [2,"∃n, k. δ = ((Unary n, Unary k) → ∃i[i=min (n, k)].Unary i) ∧ + [2,"∃n, k. δ = ((Unary n, Unary k) → ∃i[i=min (k, n)].Unary i) ∧ 0 ≤ n ∧ 0 ≤ k"] ); @@ -1984,7 +1985,7 @@ let rec zip = let zs = zip (xs, ys) in LCons ((x, y), zs)" [2,"∃n, k, a, b. - δ = ((List (a, n), List (b, k)) → ∃i[i=min (n, k)].List ((a, b), i))"] + δ = ((List (a, n), List (b, k)) → ∃i[i=min (k, n)].List ((a, b), i))"] ); "unary maximum expanded" >:: @@ -2246,8 +2247,8 @@ let rec map2_filter = fun q r f g h -> [2,"∃n, k, a, b, c. δ = ((b → Bool) → (c → Bool) → (b → c → a) → (b → a) → - (c → a) → (List (b, n), List (c, k)) → ∃i[0 ≤ i ∧ - i ≤ n + k ∧ min (n, k)≤i ∧ i≤max (k, n)].List (a, i))"] + (c → a) → (List (b, n), List (c, k)) → ∃i[i ≤ n + k ∧ + 0 ≤ i ∧ i≤max (n, k) ∧ min (n, k)≤i].List (a, i))"] ); "avl_tree--height" >::