You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The following pattern, which fills a gap between logics, could be usefully turned into a high-level tactic. I do not expect it to be used a lot (the gaps between logics are there because we don't often need to jump over them), but not having to rediscover the subtleties of bypr every time one faces a similar issue would be a good improvement here.
type in_t.
module type T = {
proc f(x:in_t): bool
}.
module W (M : T) = {
var r : bool
proc f(x) = {
r <@ M.f(x);
}
}.
lemma toto (M <: T {-W}) &m a:
phoare [W(M).f: arg = a /\ (glob M) = (glob M){m} ==> W.r] = Pr[M.f(a) @ &m : res].
proof.
proc.
call (: (glob M) = (glob M){m} /\ arg = a ==> res).
+ bypr=> &0 [] eq_glob_M ->; byequiv (: ={glob M, arg} ==> ={res})=> //.
by sim.
by auto.
qed.
This can be generalised slightly: the output type does not have to be bool, the equiv does not have to be trivial, the program does not have to be only the procedure call...
Implementing this would ideally be accompanied with documentation for call beyond just this extension.
The text was updated successfully, but these errors were encountered:
The following pattern, which fills a gap between logics, could be usefully turned into a high-level tactic. I do not expect it to be used a lot (the gaps between logics are there because we don't often need to jump over them), but not having to rediscover the subtleties of
bypr
every time one faces a similar issue would be a good improvement here.This can be generalised slightly: the output type does not have to be
bool
, theequiv
does not have to be trivial, the program does not have to be only the procedure call...Implementing this would ideally be accompanied with documentation for
call
beyond just this extension.The text was updated successfully, but these errors were encountered: