All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gapt.proofs.lk.transformations.acnf.scala Maven / Gradle / Ivy

The newest version!
package gapt.proofs.lk.transformations

import gapt.expr.formula.Formula
import gapt.expr.formula.hol.isAtom
import gapt.proofs.lk.LKProof
import gapt.proofs.lk.reductions.CutReduction
import gapt.proofs.lk.reductions.gradeReduction
import gapt.proofs.lk.reductions.leftRankReduction
import gapt.proofs.lk.reductions.rightRankReduction
import gapt.proofs.lk.rules.CutRule
import gapt.proofs.lk.rules.InitialSequent
import gapt.proofs.lk.rules.LogicalAxiom
import gapt.proofs.lk.rules.WeakeningLeftRule
import gapt.proofs.lk.rules.WeakeningRightRule

object acnf {

  /**
   * Transforms a given proof to a proof in ACNF.
   *
   * @param proof The proof to be transformed to ACNF.
   * @return A proof of the same end-sequent in ACNF.
   */
  def apply(proof: LKProof): LKProof =
    (new UppermostFirstStrategy(acnfReduction)).run(proof)

  private val acnfReduction = new CutReduction {
    def reduce(proof: CutRule): Option[LKProof] = proof match {
      case cut @ CutRule(lsb, l, rsb, _) if !isAtom(lsb.endSequent(l)) && isAcnf(lsb) && isAcnf(rsb) =>
        if (isAtom(lsb.endSequent(l)))
          (leftRankReduction orElse rightRankReduction).reduce(cut)
        else
          (gradeReduction orElse leftRankReduction orElse rightRankReduction).reduce(cut)
      case _ => None
    }
  }
}

object isAcnf {

  /**
   * This method checks whether a proof is in ACNF
   *
   * @param proof The proof to check for in ACNF.
   * @return true if proof is in ACNF, false otherwise.
   */
  def apply(proof: LKProof): Boolean = proof match {
    case InitialSequent(_) => true
    case CutRule(lsb, l, rsb, r) =>
      if (isAtom(lsb.endSequent(l))) isAcnf(lsb) && isAcnf(rsb)
      else false
    case _ => proof.immediateSubProofs.forall(isAcnf(_))
  }
}

object acnfTop {

  /**
   * Transforms a proof to a proof in ACNF Top.
   *
   * @param proof The proof to be transformed to ACNF Top
   * @return A proof of the same end-sequent in ACNF Top.
   */
  def apply(proof: LKProof): LKProof =
    (new UppermostFirstStrategy(acnfTopReduction)).run(proof)

  private val acnfTopReduction = new CutReduction {
    def reduce(proof: CutRule): Option[LKProof] =
      proof match {
        case cut @ CutRule(lsb, l, rsb, r) if isAtomicCut(cut) =>
          if (!(introOrCut(lsb, lsb.endSequent(l)) && introOrCut(rsb, rsb.endSequent(r)))) {
            if (introOrCut(lsb, lsb.endSequent(l)))
              rightRankReduction.reduce(cut)
            else
              (leftRankReduction orElse rightRankReduction).reduce(cut)
          } else {
            None
          }
        case cut @ CutRule(lsb, _, rsb, _) if isAcnfTop(lsb) && isAcnfTop(rsb) =>
          (gradeReduction orElse leftRankReduction orElse rightRankReduction).reduce(cut)
        case _ => None
      }
  }
}

object isAcnfTop {

  /**
   * This method checks whether a proof is in ACNF top
   *
   * @param proof The proof to check for in ACNF top.
   * @return true if proof is in ACNF, false otherwise.
   */
  def apply(proof: LKProof): Boolean = proof match {
    case InitialSequent(_) => true
    case CutRule(lsb, l, rsb, r) =>
      if (isAtom(lsb.endSequent(l)))
        if (introOrCut(lsb, lsb.endSequent(l)) && introOrCut(rsb, rsb.endSequent(r)))
          isAcnfTop(lsb) && isAcnfTop(rsb)
        else false
      else false
    case _ => proof.immediateSubProofs.forall(isAcnfTop(_))
  }
}

object introOrCut {

  /**
   * Checks if the last rule in proof is a leaf, a cut rule, or a weakening rule on
   * the given formula.
   *
   * @param proof   The proof we are checking.
   * @param formula The formula we are checking.
   * @return True is structure is correct or false if not.
   */
  def apply(proof: LKProof, formula: Formula): Boolean = proof match {
    case LogicalAxiom(_)             => true
    case CutRule(lsb, l, rsb, r)     => true
    case WeakeningRightRule(_, main) => if (main == formula) true else false
    case WeakeningLeftRule(_, main)  => if (main == formula) true else false
    case _                           => false
  }
}

object isAtomicCut {
  def apply(cut: CutRule): Boolean = isAtom(cut.cutFormula)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy