Skip to content

Commit dd04592

Browse files
committed
feat(corpus): expand synthetic proofs for 6 extract-script provers
Second pass: grow per-prover corpora for provers using extract scripts with synthetic fallback sections: MiniZinc: 29 -> 52 (+23, timetabling/network/logistics/puzzle/production) Dafny: 48 -> 88 (+40, maps/loops/induction/ghost/types/concurrency) Mizar: 66 -> 128 (+62, sequences/lattices/metric/finseq/ordinals/measure) F*: 76 -> 92 (+16, sequences/buffers/monotonic/tactics/dependent) Idris2: 87 -> 95 (+8, maybe/either/nat_order/stream/universe/type_level) Isabelle: 97 -> 105 (+8, sets/analysis/algebra/logic/lists/matrix/induction/auto) Combined with pass 1 (Nuprl/Minlog/Twelf/Imandra), total corpus grows from 10,645 to 11,177 entries (+532, +5%). All 17 JSONL files validate as well-formed JSON. https://claude.ai/code/session_0173ntsBsELMiXaTWvtjXdN8
1 parent 3762a58 commit dd04592

12 files changed

Lines changed: 1318 additions & 403 deletions

scripts/extract_dafny.jl

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,77 @@ function generate_synthetic_dafny()::Vector{Dict{String,Any}}
187187
("McCarthyNinetyOne", "function McCarthy91(n: int): int\n requires n >= 0\n ensures n > 100 ==> McCarthy91(n) == n - 10\n ensures n <= 100 ==> McCarthy91(n) == 91\n decreases 101 - n\n{\n if n > 100 then n - 10 else McCarthy91(McCarthy91(n + 11))\n}", ["requires", "ensures", "decreases"]),
188188
]
189189

190+
map_lemmas = [
191+
("MapPutGet", "method MapPutGet<K,V>(m: map<K,V>, k: K, v: V)\n ensures k in m[k := v]\n ensures m[k := v][k] == v\n{}", ["ensures"]),
192+
("MapRemoveAbsent", "lemma MapRemoveAbsent<K,V>(m: map<K,V>, k: K)\n requires k !in m\n ensures m - {k} == m\n{}", ["requires", "ensures"]),
193+
("MapDomainSubset", "lemma MapDomainSubset<K,V>(m1: map<K,V>, m2: map<K,V>)\n requires forall k :: k in m1 ==> k in m2 && m1[k] == m2[k]\n ensures m1.Keys <= m2.Keys\n{}", ["requires", "ensures"]),
194+
("MapDisjointMerge", "lemma MapDisjointMerge<K,V>(m1: map<K,V>, m2: map<K,V>)\n requires m1.Keys !! m2.Keys\n ensures |m1 + m2| == |m1| + |m2|\n{}", ["requires", "ensures"]),
195+
("MapKeysValues", "lemma MapKeysValues<K,V>(m: map<K,V>)\n ensures |m.Keys| == |m.Values|\n{}", ["ensures"]),
196+
("MapContainsAfterUpdate", "lemma MapContainsAfterUpdate<K,V>(m: map<K,V>, k: K, v: V, k': K)\n requires k' in m\n ensures k' in m[k := v]\n{}", ["requires", "ensures"]),
197+
("MapEmptyKeys", "lemma MapEmptyKeys<K,V>()\n ensures (map[]: map<K,V>).Keys == {}\n{}", ["ensures"]),
198+
("MapUpdateIdempotent", "lemma MapUpdateIdempotent<K,V>(m: map<K,V>, k: K, v: V)\n ensures m[k := v][k := v] == m[k := v]\n{}", ["ensures"]),
199+
]
200+
201+
loop_invariants = [
202+
("LinearSearch", "method LinearSearch(a: array<int>, key: int) returns (idx: int)\n ensures 0 <= idx ==> idx < a.Length && a[idx] == key\n ensures idx < 0 ==> forall i :: 0 <= i < a.Length ==> a[i] != key\n{\n var i := 0;\n while i < a.Length\n invariant 0 <= i <= a.Length\n invariant forall j :: 0 <= j < i ==> a[j] != key\n {\n if a[i] == key { return i; }\n i := i + 1;\n }\n return -1;\n}", ["ensures", "invariant"]),
203+
("SumArray", "method SumArray(a: array<int>) returns (s: int)\n ensures s == Sum(a[..], 0, a.Length)\n{\n s := 0;\n var i := 0;\n while i < a.Length\n invariant 0 <= i <= a.Length\n invariant s == Sum(a[..], 0, i)\n {\n s := s + a[i];\n i := i + 1;\n }\n}", ["ensures", "invariant"]),
204+
("MaxElement", "method MaxElement(a: array<int>) returns (m: int)\n requires a.Length > 0\n ensures forall i :: 0 <= i < a.Length ==> a[i] <= m\n ensures exists i :: 0 <= i < a.Length && a[i] == m\n{\n m := a[0];\n var i := 1;\n while i < a.Length\n invariant 1 <= i <= a.Length\n invariant forall j :: 0 <= j < i ==> a[j] <= m\n invariant exists j :: 0 <= j < i && a[j] == m\n {\n if a[i] > m { m := a[i]; }\n i := i + 1;\n }\n}", ["requires", "ensures", "invariant"]),
205+
("CountOccurrences", "method CountOccurrences(a: array<int>, key: int) returns (c: int)\n ensures c == |set i | 0 <= i < a.Length && a[i] == key|\n{\n c := 0;\n var i := 0;\n while i < a.Length\n invariant 0 <= i <= a.Length\n invariant c == |set j | 0 <= j < i && a[j] == key|\n {\n if a[i] == key { c := c + 1; }\n i := i + 1;\n }\n}", ["ensures", "invariant"]),
206+
("ReverseInPlace", "method ReverseInPlace(a: array<int>)\n modifies a\n ensures forall i :: 0 <= i < a.Length ==> a[i] == old(a[a.Length - 1 - i])\n{\n var lo, hi := 0, a.Length - 1;\n while lo < hi\n invariant 0 <= lo && hi < a.Length\n invariant lo + hi == a.Length - 1\n invariant forall i :: 0 <= i < lo ==> a[i] == old(a[a.Length - 1 - i])\n invariant forall i :: hi < i < a.Length ==> a[i] == old(a[a.Length - 1 - i])\n invariant forall i :: lo <= i <= hi ==> a[i] == old(a[i])\n {\n a[lo], a[hi] := a[hi], a[lo];\n lo, hi := lo + 1, hi - 1;\n }\n}", ["modifies", "ensures", "invariant"]),
207+
("CopyArray", "method CopyArray(src: array<int>) returns (dst: array<int>)\n ensures dst.Length == src.Length\n ensures forall i :: 0 <= i < src.Length ==> dst[i] == src[i]\n ensures fresh(dst)\n{\n dst := new int[src.Length];\n var i := 0;\n while i < src.Length\n invariant 0 <= i <= src.Length\n invariant forall j :: 0 <= j < i ==> dst[j] == src[j]\n {\n dst[i] := src[i];\n i := i + 1;\n }\n}", ["ensures", "invariant"]),
208+
("Partition", "method Partition(a: array<int>, lo: int, hi: int) returns (p: int)\n requires 0 <= lo < hi <= a.Length\n modifies a\n ensures lo <= p < hi\n ensures forall i :: lo <= i < p ==> a[i] <= a[p]\n ensures forall i :: p < i < hi ==> a[i] > a[p]\n ensures multiset(a[lo..hi]) == multiset(old(a[lo..hi]))\n{}", ["requires", "modifies", "ensures"]),
209+
("TwoSum", "method TwoSum(a: array<int>, target: int) returns (i: int, j: int)\n requires Sorted(a, 0, a.Length)\n ensures 0 <= i < j < a.Length ==> a[i] + a[j] == target\n{\n i, j := 0, a.Length - 1;\n while i < j\n invariant 0 <= i && j < a.Length\n invariant forall p, q :: 0 <= p < i && i <= q < a.Length ==> a[p] + a[q] != target\n {\n if a[i] + a[j] == target { return; }\n else if a[i] + a[j] < target { i := i + 1; }\n else { j := j - 1; }\n }\n return -1, -1;\n}", ["requires", "ensures", "invariant"]),
210+
]
211+
212+
inductive_proofs = [
213+
("SumFormula", "lemma SumFormula(n: nat)\n ensures 2 * SumTo(n) == n * (n + 1)\n decreases n\n{\n if n == 0 { } else { SumFormula(n - 1); }\n}", ["ensures", "decreases"]),
214+
("PowerMonotone", "lemma PowerMonotone(b: nat, m: nat, n: nat)\n requires b >= 2 && m <= n\n ensures Pow(b, m) <= Pow(b, n)\n decreases n - m\n{\n if m == n { } else { PowerMonotone(b, m, n - 1); }\n}", ["requires", "ensures", "decreases"]),
215+
("ListFlatten", "lemma ListFlatten<T>(l1: List<T>, l2: List<T>)\n ensures Length(Append(l1, l2)) == Length(l1) + Length(l2)\n decreases l1\n{\n match l1 { case Nil => case Cons(_, tl) => ListFlatten(tl, l2); }\n}", ["ensures", "decreases"]),
216+
("TreeHeight", "lemma TreeHeight(t: Tree)\n ensures Height(t) >= 0\n decreases t\n{\n match t {\n case Leaf => {}\n case Node(l, _, r) => { TreeHeight(l); TreeHeight(r); }\n }\n}", ["ensures", "decreases"]),
217+
("FibMonotone", "lemma FibMonotone(m: nat, n: nat)\n requires m <= n && m >= 1\n ensures Fib(m) <= Fib(n)\n decreases n - m\n{\n if m == n { } else { FibMonotone(m, n - 1); FibPositive(n - 2); }\n}", ["requires", "ensures", "decreases"]),
218+
("StrongInduction", "lemma StrongInduction(n: nat, P: nat -> bool)\n requires forall k: nat :: (forall j: nat :: j < k ==> P(j)) ==> P(k)\n ensures P(n)\n decreases n\n{\n forall j: nat | j < n ensures P(j) { StrongInduction(j, P); }\n}", ["requires", "ensures", "decreases"]),
219+
("BinomialTheorem", "lemma BinomialTheorem(x: int, y: int, n: nat)\n ensures Pow(x + y, n) == Sum(k => Choose(n, k) * Pow(x, n - k) * Pow(y, k), 0, n)\n decreases n\n{}", ["ensures", "decreases"]),
220+
]
221+
222+
ghost_state = [
223+
("GhostCounter", "method GhostCounter(n: nat) returns (r: nat)\n ensures r == n\n{\n r := 0;\n ghost var g := 0;\n while r < n\n invariant r == g && r <= n\n {\n r := r + 1;\n g := g + 1;\n }\n}", ["ensures", "invariant"]),
224+
("FrameCondition", "method FrameCondition(a: array<int>, b: array<int>, i: nat)\n requires a != b && i < a.Length\n modifies a\n ensures b[..] == old(b[..])\n ensures forall j :: 0 <= j < a.Length && j != i ==> a[j] == old(a[j])\n{\n a[i] := a[i] + 1;\n}", ["requires", "modifies", "ensures"]),
225+
("ReprValid", "class Node {\n var val: int\n var next: Node?\n ghost var repr: set<Node>\n predicate Valid()\n reads this, repr\n {\n this in repr &&\n (next != null ==> next in repr && next.repr < repr && next.Valid())\n }\n}", ["reads"]),
226+
("AllocFresh", "method AllocFresh() returns (r: array<int>)\n ensures fresh(r)\n ensures r.Length == 10\n ensures forall i :: 0 <= i < 10 ==> r[i] == 0\n{\n r := new int[10];\n}", ["ensures"]),
227+
("GhostSequence", "method GhostSequence(a: array<int>)\n modifies a\n ensures a[..] == Reverse(old(a[..]))\n{\n ghost var original := a[..];\n ReverseInPlace(a);\n}", ["modifies", "ensures"]),
228+
]
229+
230+
type_refinement = [
231+
("NonNullArray", "type NonNullArray = a: array<int> | a.Length > 0 witness *", []),
232+
("PositiveInt", "type Positive = n: int | n > 0 witness 1", []),
233+
("BoundedInt", "type Bounded = n: int | 0 <= n < 256 witness 0", []),
234+
("EvenNat", "type EvenNat = n: nat | n % 2 == 0 witness 0", []),
235+
("SortedSeq", "type SortedSeq = s: seq<int> | forall i, j :: 0 <= i < j < |s| ==> s[i] <= s[j] witness []", []),
236+
("NonEmptySeq", "type NonEmptySeq<T> = s: seq<T> | |s| > 0 witness *", []),
237+
("UniqueSeq", "type UniqueSeq<T(==)> = s: seq<T> | forall i, j :: 0 <= i < j < |s| ==> s[i] != s[j] witness []", []),
238+
("Percentage", "type Percentage = r: real | 0.0 <= r <= 100.0 witness 0.0", []),
239+
]
240+
241+
concurrency_specs = [
242+
("MutexSpec", "class Mutex {\n ghost var locked: bool\n method Acquire()\n requires !locked\n modifies this\n ensures locked\n {\n locked := true;\n }\n method Release()\n requires locked\n modifies this\n ensures !locked\n {\n locked := false;\n }\n}", ["requires", "modifies", "ensures"]),
243+
("TokenRing", "method TokenRing(nodes: array<bool>, holder: nat)\n requires holder < nodes.Length\n requires nodes[holder] == true\n requires forall i :: 0 <= i < nodes.Length && i != holder ==> nodes[i] == false\n modifies nodes\n ensures nodes[(holder + 1) % nodes.Length] == true\n ensures forall i :: 0 <= i < nodes.Length && i != (holder + 1) % nodes.Length ==> nodes[i] == false\n{}", ["requires", "modifies", "ensures"]),
244+
("AtomicIncrement", "method AtomicIncrement(x: int) returns (y: int)\n ensures y == x + 1\n{\n y := x + 1;\n}", ["ensures"]),
245+
("CompareAndSwap", "method CAS(r: ref<int>, expected: int, desired: int) returns (success: bool)\n modifies r\n ensures success ==> old(r.val) == expected && r.val == desired\n ensures !success ==> r.val == old(r.val)\n{}", ["modifies", "ensures"]),
246+
]
247+
190248
all_categories = [
191249
("arithmetic", arithmetic_lemmas),
192250
("sequences", sequence_lemmas),
193251
("sets", set_lemmas),
194252
("sorting", sorting_search),
195253
("data_structures", data_structures),
196254
("termination", termination),
255+
("maps", map_lemmas),
256+
("loops", loop_invariants),
257+
("induction", inductive_proofs),
258+
("ghost", ghost_state),
259+
("types", type_refinement),
260+
("concurrency", concurrency_specs),
197261
]
198262

199263
proofs = Dict{String,Any}[]

0 commit comments

Comments
 (0)