Zulip Chat Archive
Stream: general
Topic: decidable instance of prop logic eval function
Paige Thomas (Feb 06 2025 at 05:06):
I'm wondering if there is a way to make the #eval here work, where it gives
failed to synthesize
  Decidable (eval (gen_valuation (fun x => True) [("P", False)]) (atom_ "P"))
I proved a decidable instance, but I'm guessing it probably can't use it because of the (h1 : ∀ (el : String × Prop), el ∈ l → Decidable el.2) hypothesis?
import Mathlib.Tactic
import Mathlib.Util.CompileInductive
set_option autoImplicit false
namespace Prop_
/--
  The type of formulas.
-/
inductive Formula_ : Type
  | false_ : Formula_
  | true_ : Formula_
  | atom_ : String → Formula_
  | not_ : Formula_ → Formula_
  | and_ : Formula_ → Formula_ → Formula_
  | or_ : Formula_ → Formula_ → Formula_
  | imp_ : Formula_ → Formula_ → Formula_
  | iff_ : Formula_ → Formula_ → Formula_
  deriving Inhabited, DecidableEq, Repr
compile_inductive% Formula_
open Formula_
/--
  A function from the set of atoms to the set of truth values `{False, True}`.
-/
def Valuation : Type := String → Prop
  deriving Inhabited
/--
  `eval V F` := True if and only if the formula `F` evaluates to `True` given the valuation `V`.
-/
def eval
  (V : Valuation) :
  Formula_ → Prop
  | false_ => False
  | true_ => True
  | atom_ X => V X
  | not_ phi => ¬ eval V phi
  | and_ phi psi => eval V phi ∧ eval V psi
  | or_ phi psi => eval V phi ∨ eval V psi
  | imp_ phi psi => eval V phi → eval V psi
  | iff_ phi psi => eval V phi ↔ eval V psi
instance
  (V : Valuation)
  [DecidablePred V]
  (F : Formula_) :
  Decidable (eval V F) :=
  by
  induction F
  all_goals
    simp only [eval]
    infer_instance
def Function.updateITE
  {α β : Type}
  [DecidableEq α]
  (f : α → β)
  (a : α)
  (b : β)
  (c : α) :
  β :=
  if c = a then b else f c
def gen_valuation
  (default : Valuation) :
  List (String × Prop) → Valuation
  | [] => default
  | hd :: tl => Function.updateITE (gen_valuation default tl) hd.fst hd.snd
instance
  (V : Valuation)
  [DecidablePred V]
  (l : List (String × Prop))
  (F : Formula_)
  (h1 : ∀ (el : String × Prop), el ∈ l → Decidable el.2) :
  Decidable (eval (gen_valuation V l) F) :=
  by
  have s1 : DecidablePred (gen_valuation V l) :=
  by
    induction l
    case nil =>
      simp only [gen_valuation]
      infer_instance
    case cons hd tl ih =>
      simp only [gen_valuation]
      unfold DecidablePred
      intro a
      simp only [Function.updateITE]
      split_ifs
      case pos c1 =>
        apply h1
        simp
      case neg c1 =>
        apply ih
        intro el a1
        apply h1
        simp
        tauto
  infer_instance
#eval eval (gen_valuation (fun _ => True) [("P", False)]) (atom_ "P")
Yury G. Kudryashov (Feb 06 2025 at 07:49):
Instance search doesn't work with non instance assumptions
Paige Thomas (Feb 07 2025 at 03:28):
I guess maybe I should change this all to Bool.
Yury G. Kudryashov (Feb 07 2025 at 05:22):
If you don't need undecidable propositions, then Bool is better.
Paige Thomas (Feb 07 2025 at 06:01):
I haveset_option autoImplicit false, but for some reason it doesn't complain about eval V P ↔ eval V Q, where both eval V P and eval V Q are Bool. Is there a way to make it complain and require that it be written (eval V P = true) ↔ (eval V Q = true)?
Yury G. Kudryashov (Feb 07 2025 at 06:56):
This has nothing to do with autoImplicit. Lean knows how to coerce a Bool to a Prop.
Yury G. Kudryashov (Feb 07 2025 at 06:56):
So, if you use a Bool in a context that expects Prop, then it replaces it with b = true.
Yury G. Kudryashov (Feb 07 2025 at 06:57):
It's docs#boolToProp
Yury G. Kudryashov (Feb 07 2025 at 06:57):
You can try locally disabling this instance.
Paige Thomas (Feb 07 2025 at 07:04):
I see.
Paige Thomas (Feb 07 2025 at 07:07):
Is there a way to disable all automatic coercions?
Yury G. Kudryashov (Feb 07 2025 at 07:11):
AFAIK, no. Why do you want it?
Paige Thomas (Feb 07 2025 at 07:16):
Just to make it easier to differentiate things and see what the type really is and what is being done.
Paige Thomas (Feb 07 2025 at 07:18):
I can write it manually, but if it complained I would be sure of not missing an instance.
Paige Thomas (Feb 07 2025 at 07:20):
Alternatively a linter would also work.
Last updated: May 02 2025 at 03:31 UTC