-
Philippe Suter authoredPhilippe Suter authored
PropositionalLogic.scala 2.08 KiB
/** Type refinement: A desugarized formula does not contain an Imply node.
This condition must hold recursively over the whole tree
*/
/* constraint (\forall f. f \in DesugaredFormula <-->
( f \in Tru |
f \in Flse |
(f \in Neg & Neg_getField_f(f) \in DesugaredFormula) |
(f \in IOr & IOr_getField_left(f) \in DesugaredFormula & IOr_getField_right(f) \in DesugaredFormula) |
(f \in IAnd & IAnd_getField_left(f) \in DesugaredFormula & IAnd_getField_right(f) \in DesugaredFormula)
))
*/
package funpm.logic
sealed abstract case class IFormula()
case class IAnd(val left: IFormula, val right: IFormula) extends IFormula
case class IOr(val left: IFormula, val right: IFormula) extends IFormula
case class Neg(val f: IFormula) extends IFormula
case object Tru extends IFormula
case object Flse extends IFormula
case class IImply(val left: IFormula, val right: IFormula) extends IFormula
object Desugar {
def apply(f: IFormula): IFormula =
/* postcondition res \in DesugaredFormula */
f match {
case Tru => f
case Flse => f
case IAnd(left,right) => IAnd(apply(left),apply(right))
case IOr(left,right) => IOr(apply(left),apply(right))
case Neg(f) => Neg(apply(f))
case IImply(left,right) => IOr(Neg(this.apply(left)),this.apply(right))
}
/**
This examples is interesting because uses method desugarize postcondition
in order to prove completeness of the PM.
*/
def isDesugared(f: IFormula): Boolean = apply(f) match {
case IAnd(left,right) => isDesugared(left) && isDesugared(right)
case IOr(left,right) => isDesugared(left) && isDesugared(right)
case Neg(f) => isDesugared(f)
case Tru => true
case Flse => true
}
}
object PropositionalLogic extends Application {
// main
assert(Desugar.isDesugared(Desugar.apply(IImply(IImply(Tru,Flse),Flse))))
}