File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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+
439469end
You can’t perform that action at this time.
0 commit comments