Skip to content

Commit 8f0a8bf

Browse files
committed
add succint 'unit test-like' demonstrator
1 parent 9f97fc2 commit 8f0a8bf

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

proofs/sudoers.mlw

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,4 +436,34 @@ let expand_all_aliases (items: seq (spec 'tag 'a)) (table: seq (def 'a)) (ghost
436436
done;
437437
!cur
438438

439+
let demonstration (items: seq (spec 'tag 'a)) (table: seq (def 'a)) (pred: 'a -> bool)
440+
(* make sure the keys are uniquely defined *)
441+
requires { forall i j. 0 <= i < j < length table ->
442+
let (k1, _) = table[i] in
443+
let (k2, _) = table[j] in
444+
k1 <> k2 }
445+
446+
(* require all aliases to be defined in the table *)
447+
requires { forall key.
448+
(exists i. 0 <= i < length items /\ who items[i] = Alias key) \/
449+
(exists k i. 0 <= k < length table /\ let (_, items) = table[k] in
450+
0 <= i < length items /\ who items[i] = Alias key)
451+
->
452+
exists j. 0 <= j < length table /\ let (id, _) = table[j] in id = key }
453+
454+
(* make sure the table is topologically sorted *)
455+
requires { forall i j. 0 <= i <= j < length table ->
456+
let (_, items) = table[i] in
457+
let (key, _) = table[j] in
458+
forall k. 0 <= k < length items -> who items[k] <> Alias key }
459+
460+
= let aliases = get_aliases table pred in
461+
462+
let expanded = expand_all_aliases items table (ghost pred) (ghost aliases) in
463+
464+
let a = find_item expanded pred (any found_aliases) in
465+
let b = find_item items pred aliases in
466+
467+
assert { a = b }
468+
439469
end

0 commit comments

Comments
 (0)