Skip to content

Commit 3b9d789

Browse files
committed
wip constant variables vs mutables
1 parent ac69889 commit 3b9d789

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

Prover/GriesSchneider.fs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,24 @@ let ``+ over ↓`` () =
299299
let ``+ over ↑`` () =
300300
proof { theorem "+ over ↑" (p + Max(n, m) = Max(p + n, p + m)) }
301301

302+
let gcd m n =
303+
let decl = FnDecl("gcd", [ WInt; WInt; WInt ])
304+
FnApp(decl, [ m; n ])
305+
306+
let ``GCD symmetry`` = gcd m n = gcd n m |> axiom "GCD symmetry"
307+
308+
let ``GCD associativity`` =
309+
gcd (gcd m n) p = gcd m (gcd n p) |> axiom "GCD associativity"
310+
311+
let abs n = Max(n, -n)
312+
313+
let ``GS 15.98`` = gcd n n = abs n |> axiom "GS 15.98"
314+
315+
let ``gcd zero`` = gcd one n = one |> axiom "GCD zero"
316+
317+
let ``GS 15.101`` = gcd m n = gcd (abs m) (abs n) |> axiom "GS 15.101"
318+
319+
let ``GS 15.102`` = gcd m n = gcd m (m + n) |> axiom "GS 15.102"
302320

303321
// Sequences
304322

Test/WybeLangTest.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,15 @@ let ``ast to semantic block`` () =
181181

182182
[<Fact>]
183183
let ``Euclid algorithm semantics`` () =
184+
let a, b = mkIntVar "a", mkIntVar "b"
185+
let originalVars = Becomes [ "n", DomainWExpr(None, a); "m", DomainWExpr(None, b) ]
186+
184187
let ifBody =
185188
If
186189
[ Guard(m > n, Becomes [ "m", DomainWExpr(None, m - n) ])
187190
Guard(n > m, Becomes [ "n", DomainWExpr(None, n - m) ]) ]
188191

189192
let doMeqN = Do [ Guard(m != n, ifBody) ]
190-
191-
let r = wpStatement doMeqN (m = n)
193+
let initDo = Compose(originalVars, doMeqN)
194+
let r = wpStatement initDo (m = n <&&> (gcd m n = gcd a b))
192195
printfn $"r {r}"

0 commit comments

Comments
 (0)