Skip to content

Tactic async while is unsound #774

@oskgo

Description

@oskgo

MRE:

module SpinTrue = {
  proc spin() = {
    while (true) {
    }
  }
}.

module SpinFalse = {
  proc spin() = {
    while (false) {
    }
  }
}.

equiv L: SpinFalse.spin ~ SpinTrue.spin:
  true ==> true.
proof.
proc.
async while [predT,1] [predT,1] true true: (false) => //.
qed.

Deriving false from L:

require import AllCore.

lemma LF &m: Pr[SpinFalse.spin()@&m:true]=1%r.
proof. byphoare => //; proc; rcondf 1 => //. qed.

lemma LT &m: Pr[SpinTrue .spin()@&m:true]=0%r.
proof. byphoare => //; proc; hoare; while (true) => //. qed.

lemma F: false.
suff//: forall &m, 1%r = 0%r.
move => &m.
rewrite -(LF &m) -(LT &m).
byequiv L => //.
qed.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions