Zulip Chat Archive

Stream: lean4

Topic: Construct witness of a product in a subtype proof


Malcolm Langfield (Mar 19 2024 at 18:22):

Consider the following two examples. In the first, we construct a witness by providing a proof of True, and so Lean "learns" that C = fun _ _ => True. I want to do something similar in the second case.

lemma infant : { C : Nat  Nat  Prop //  {m n : Nat}, C m n } := by
  constructor
  intros _ _
  refine' True.intro

lemma baby : { C : (Nat  Nat  Prop) × Nat //  {m n : Nat}, (Prod.fst C) m n } := by
  constructor
  intros m n
  refine' True.intro
  sorry

Instead, I get this error:

 2 goals
case property
s₀ s₁ : State
fuel m n : 
 ?val.1 m n

case val
s₀ s₁ : State
fuel : 
 (    Prop) × 

 expected type (482:11-482:21)
s₀ s₁ : State
fuel m n : 
 ?val.1 m n

 482:3-482:21: error:
type mismatch
  True.intro
has type
  True : Prop
but is expected to have type
  ?val.1 m n : Prop

The motivation for this is during a long subtype proof that begins with constructor, I would like to reference intermediate values constructed in the proof within the witness for C, but I don't want to prove that they can be expressed in terms of only constants and the arguments to C, and so instead I would like to assert the existence of these intermediate values and construct them, but I do not know how to do this.


Last updated: May 02 2025 at 03:31 UTC