Skip to content

Commit 9b05c87

Browse files
authored
Added names to built-in axioms and missind QIDs to built-in quantifiers, to avoid nameless quantifiers in SMT output (#927)
1 parent 2e6c3b7 commit 9b05c87

7 files changed

Lines changed: 106 additions & 102 deletions

File tree

src/main/resources/dafny_axioms/maps.vpr

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,39 @@ domain $Map[K, V] {
1212

1313
/* ** Cardinality */
1414

15-
axiom {
15+
axiom Map_card_nonneg {
1616
forall m : $Map[K, V] :: { Map_card(m) } 0 <= Map_card(m)
1717
}
1818

1919
/* added second trigger set */
20-
axiom {
20+
axiom Map_domain_card {
2121
forall m : $Map[K, V] :: { |Map_domain(m)| } {Map_card(m)} |Map_domain(m)| == Map_card(m)
2222
}
2323

2424
/* ** Disjointness */
2525

2626
/* split in both directions */
27-
axiom {
27+
axiom Map_disjoint_def1 {
2828
forall m1 : $Map[K, V], m2 : $Map[K, V] :: { Map_disjoint(m1, m2) }
2929
Map_disjoint(m1, m2) ==>
3030
(forall k : K :: { k in Map_domain(m1) } {k in Map_domain(m2) }
3131
!(k in Map_domain(m1)) || !(k in Map_domain(m2)))
3232
}
3333

34-
axiom {
34+
axiom Map_disjoint_def2 {
3535
forall m1 : $Map[K, V], m2 : $Map[K, V] :: { Map_disjoint(m1, m2) }
3636
!Map_disjoint(m1, m2) ==>
3737
(exists k : K :: (k in Map_domain(m1)) && (k in Map_domain(m2)))
3838
}
3939

4040
/* ** Empty */
41-
axiom {
41+
axiom Map_empty_domain {
4242
forall k : K :: { k in Map_domain((Map_empty() : $Map[K, V])) }
4343
!(k in Map_domain((Map_empty() : $Map[K, V])))
4444
}
4545

4646
/* split last part in both directions */
47-
axiom {
47+
axiom Map_card_zero {
4848
forall m : $Map[K, V] :: { Map_card(m) }
4949
(Map_card(m) == 0 <==> m == Map_empty()) &&
5050
(Map_card(m) != 0 ==> exists u : K :: u in Map_domain(m)) &&
@@ -53,14 +53,14 @@ domain $Map[K, V] {
5353

5454
/* Equality */
5555
// this axiom is only needed in one direction; the other is implied by the next axiom
56-
axiom {
56+
axiom Map_equal_def {
5757
forall m1 : $Map[K, V], m2 : $Map[K, V] :: { Map_equal(m1, m2) }
5858
((forall k : K :: { k in Map_domain(m1) } { k in Map_domain(m2) } k in Map_domain(m1) <==> k in Map_domain(m2)) &&
5959
(forall k : K :: { Map_apply(m1, k) } { Map_apply(m2, k) } k in Map_domain(m1) ==> Map_apply(m1, k) == Map_apply(m2, k)))
6060
==> Map_equal(m1, m2)
6161
}
6262

63-
axiom {
63+
axiom Map_equal_ext {
6464
forall m1 : $Map[K, V], m2 : $Map[K, V] :: { Map_equal(m1, m2) }
6565
Map_equal(m1, m2) ==> m1 == m2
6666
}
@@ -69,15 +69,15 @@ domain $Map[K, V] {
6969

7070
/* added second trigger set (cf. example3 test case, test3)
7171
/* could also add {Map_update(m,k1,v), Map_apply(m,k1)} as another alternative trigger, but seems subsumed given that we need to know k2 is in a domain */
72-
axiom {
72+
axiom Map_update_domain {
7373
forall m : $Map[K, V], k1 : K, k2 : K, v : V ::
7474
{ k2 in Map_domain(Map_update(m, k1, v)) } {k2 in Map_domain(m), Map_update(m, k1, v)} { Map_apply(Map_update(m, k1, v), k2) }
7575
(k1 == k2 ==> k2 in Map_domain(Map_update(m, k1, v)) && Map_apply(Map_update(m, k1, v), k2) == v) &&
7676
(k1 != k2 ==> (k2 in Map_domain(Map_update(m, k1, v)) <==> k2 in Map_domain(m)) && (k2 in Map_domain(m) ==> Map_apply(Map_update(m, k1, v), k2) == Map_apply(m, k2)))
7777
}
7878

7979
/* added second trigger set (not sure of a test case needing it, though) */
80-
axiom {
80+
axiom Map_update_card {
8181
forall m : $Map[K, V], k : K, v : V :: { Map_card(Map_update(m, k, v)) } { Map_card(m), Map_update(m, k, v)}
8282
(k in Map_domain(m) ==> Map_card(Map_update(m, k, v)) == Map_card(m)) &&
8383
(!(k in Map_domain(m)) ==> Map_card(Map_update(m, k, v)) == Map_card(m) + 1)
@@ -91,20 +91,20 @@ domain $Map[K, V] {
9191
// exists k : K :: { k in Map_domain(m) } { Map_apply(m, k) }
9292
// k in Map_domain(m) && v == Map_apply(m, k)
9393
// }
94-
axiom {
94+
axiom Map_values_contains {
9595
forall m : $Map[K, V], v : V :: { v in Map_values(m) }
9696
v in Map_values(m) ==>
9797
Map_range_domain_skolem(m,v) in Map_domain(m) && v == Map_apply(m, Map_range_domain_skolem(m,v))
9898
}
9999

100-
axiom {
100+
axiom Map_values_nonempty {
101101
forall m : $Map[K, V], k : K :: { Map_apply(m, k) } { k in Map_domain(m) }
102102
(k in Map_domain(m)
103103
==> |Map_values(m)| > 0) // weaker than the axiom below, but with weaker triggering
104104
}
105105

106106
/* no need for an "in" term to match this one; cf. example3 test case test5 */
107-
axiom {
107+
axiom Map_values_contains {
108108
forall m : $Map[K, V], k : K :: { Map_apply(m, k) } // { k in Map_domain(m) } // REMOVED trigger - this can create issues if several maps share the domain
109109
(k in Map_domain(m)
110110
==> Map_apply(m, k) in Map_values(m))

src/main/resources/dafny_axioms/multisets.vpr

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,96 +9,96 @@ define Math_clip(a) a < 0 ? 0 : a
99
domain $Multiset[E] {
1010
function Multiset_count(ms: $Multiset[E], x: E): Int
1111

12-
axiom {
12+
axiom MS_count_nonneg {
1313
forall ms: $Multiset[E], x: E :: { Multiset_count(ms, x) }
1414
Multiset_count(ms, x) >= 0
1515
}
1616

1717
function Multiset_card(ms: $Multiset[E]): Int
18-
axiom {
18+
axiom MS_card_nonneg {
1919
forall s: $Multiset[E] :: { Multiset_card(s) } 0 <= Multiset_card(s)
2020
}
2121

2222
function Multiset_empty(): $Multiset[E]
23-
axiom {
23+
axiom MS_empty_count {
2424
forall o: E :: { Multiset_count(Multiset_empty(), o) } Multiset_count(Multiset_empty(), o) == 0
2525
}
26-
axiom {
26+
axiom MS_card_zero {
2727
forall s: $Multiset[E] :: { Multiset_card(s) }
2828
(Multiset_card(s) == 0 <==> s == Multiset_empty()) &&
2929
(Multiset_card(s) != 0 ==> (exists x: E :: 0 < Multiset_count(s, x)))
3030
}
3131

3232
function Multiset_singleton(e: E): $Multiset[E]
3333

34-
axiom {
34+
axiom MS_singleton_count {
3535
forall r: E, o: E :: { Multiset_count(Multiset_singleton(r), o) }
3636
(Multiset_count(Multiset_singleton(r), o) == 1 <==> r == o) &&
3737
(Multiset_count(Multiset_singleton(r), o) == 0 <==> r != o)
3838
}
39-
axiom {
39+
axiom MS_singleton_card {
4040
forall r: E :: { Multiset_singleton(r) } Multiset_card(Multiset_singleton(r)) == 1 && Multiset_count(Multiset_singleton(r), r) == 1
4141
}
42-
axiom {
42+
axiom MS_unionone_empty {
4343
forall r: E :: { Multiset_singleton(r) } Multiset_singleton(r) == Multiset_unionone(Multiset_empty(), r)
4444
}
4545

4646
function Multiset_unionone(ms: $Multiset[E], t: E): $Multiset[E]
47-
axiom {
47+
axiom MS_unionone_count {
4848
forall a: $Multiset[E], x: E, o: E :: { Multiset_count(Multiset_unionone(a, x), o) } { Multiset_unionone(a, x), Multiset_count(a, o) }
4949
Multiset_count(Multiset_unionone(a, x), o) == (x == o ? Multiset_count(a, o) + 1 : Multiset_count(a, o))
5050
}
51-
axiom {
51+
axiom MS_unionone_card {
5252
forall a: $Multiset[E], x: E :: { Multiset_card(Multiset_unionone(a, x)) } { Multiset_unionone(a, x), Multiset_card(a) }
5353
Multiset_card(Multiset_unionone(a, x)) == Multiset_card(a) + 1
5454
}
55-
axiom {
55+
axiom MS_unionone_positive {
5656
forall a: $Multiset[E], x: E :: { Multiset_unionone(a, x) }
5757
Multiset_count(Multiset_unionone(a, x), x) > 0 && Multiset_card(Multiset_unionone(a, x)) > 0
5858
}
5959

6060
function Multiset_union(ms0: $Multiset[E], ms1: $Multiset[E]): $Multiset[E]
61-
axiom {
61+
axiom MS_union_count {
6262
forall a: $Multiset[E], b: $Multiset[E], o: E :: { Multiset_count(Multiset_union(a, b), o) } { Multiset_union(a, b), Multiset_count(a, o), Multiset_count(b, o) }
6363
Multiset_count(Multiset_union(a, b), o) == Multiset_count(a, o) + Multiset_count(b, o)
6464
}
65-
axiom {
65+
axiom MS_union_card {
6666
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_card(Multiset_union(a, b)) } { Multiset_card(a), Multiset_union(a, b) } { Multiset_card(b), Multiset_union(a, b) }
6767
Multiset_card(Multiset_union(a, b)) == Multiset_card(a) + Multiset_card(b)
6868
}
6969

7070
function Multiset_intersection(ms0: $Multiset[E], ms1: $Multiset[E]): $Multiset[E]
71-
axiom {
71+
axiom MS_intersect_count {
7272
forall a: $Multiset[E], b: $Multiset[E], o: E :: { Multiset_count(Multiset_intersection(a, b), o) }
7373
Multiset_count(Multiset_intersection(a, b), o) == Math_min(Multiset_count(a, o), Multiset_count(b, o))
7474
}
75-
axiom {
75+
axiom MS_intersect_absorb1 {
7676
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_intersection(Multiset_intersection(a, b), b) }
7777
Multiset_intersection(Multiset_intersection(a, b), b) == Multiset_intersection(a, b)
7878
}
79-
axiom {
79+
axiom MS_intersect_absorb2 {
8080
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_intersection(a, Multiset_intersection(a, b)) }
8181
Multiset_intersection(a, Multiset_intersection(a, b)) == Multiset_intersection(a, b)
8282
}
8383

8484
function Multiset_difference(ms0: $Multiset[E], ms1: $Multiset[E]): $Multiset[E]
85-
axiom {
85+
axiom MS_diff_count1 {
8686
forall a: $Multiset[E], b: $Multiset[E], o: E :: { Multiset_count(Multiset_difference(a, b), o) }
8787
Multiset_count(Multiset_difference(a, b), o) == Math_clip(Multiset_count(a, o) - Multiset_count(b, o))
8888
}
89-
axiom {
89+
axiom MS_diff_count2 {
9090
forall a: $Multiset[E], b: $Multiset[E], y: E :: { Multiset_difference(a, b), Multiset_count(b, y), Multiset_count(a, y) }
9191
Multiset_count(a, y) <= Multiset_count(b, y) ==> Multiset_count(Multiset_difference(a, b), y) == 0
9292
}
93-
axiom {
93+
axiom MS_diff_card {
9494
forall a: $Multiset[E], b: $Multiset[E] ::
9595
{ Multiset_card(Multiset_difference(a, b)) }
9696
Multiset_card(Multiset_difference(a, b)) + Multiset_card(Multiset_difference(b, a)) + 2 * Multiset_card(Multiset_intersection(a, b)) == Multiset_card(Multiset_union(a, b)) &&
9797
Multiset_card(Multiset_difference(a, b)) == Multiset_card(a) - Multiset_card(Multiset_intersection(a, b))
9898
}
9999

100100
function Multiset_subset(ms0: $Multiset[E], ms1: $Multiset[E]): Bool
101-
axiom {
101+
axiom MS_subset_def {
102102
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_subset(a, b) }
103103
Multiset_subset(a, b) <==> (forall o: E :: { Multiset_count(a, o) } { Multiset_count(b, o) } Multiset_count(a, o) <= Multiset_count(b, o))
104104
}
@@ -111,18 +111,18 @@ domain $Multiset[E] {
111111
}
112112
*/
113113
function Multiset_skolem_diff(s0: $Multiset[E], s1: $Multiset[E]): E
114-
axiom {
114+
axiom MS_equal_def {
115115
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_equal(a, b) }
116116
(Multiset_equal(a, b) && a==b) ||
117117
(!Multiset_equal(a, b) && a != b && Multiset_skolem_diff(a, b) == Multiset_skolem_diff(b, a) && Multiset_count(a, Multiset_skolem_diff(a, b)) != Multiset_count(b, Multiset_skolem_diff(a, b)))
118118
}
119-
axiom {
119+
axiom MS_equal_ext {
120120
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_equal(a, b) }
121121
Multiset_equal(a, b) ==> a == b
122122
}
123123

124124
function Multiset_disjoint(ms0: $Multiset[E], ms1: $Multiset[E]): Bool
125-
axiom {
125+
axiom MS_disjoint_def {
126126
forall a: $Multiset[E], b: $Multiset[E] :: { Multiset_disjoint(a, b) }
127127
Multiset_disjoint(a, b) <==> (forall o: E :: { Multiset_count(a, o) } { Multiset_count(b, o) } Multiset_count(a, o) == 0 || Multiset_count(b, o) == 0)
128128
}

0 commit comments

Comments
 (0)