Coq 如何将重写应用于条件的右侧而不拆分它?

Coq 如何将重写应用于条件的右侧而不拆分它?,coq,Coq,我在想,如果我能以某种方式仅在右侧应用IHl,那么我就可以应用HL来解决这个问题,但我不知道如何解决 如果我在这里使用split,那么我将失去解决这个问题的能力,因为我必须在假设的分支中证明x=a,反之亦然。注意几点: 首先,你的证明太长了。再多想一想,特别是看看你是否在错误的地方做了太多的诱导或分裂 其次,这类重写有点难,但其中一些重写可以通过“Setoids”和iff实现。您可能对或\u iff\u compat\l引理感兴趣: A : Type x : A l, l' : l

我在想,如果我能以某种方式仅在右侧应用
IHl
,那么我就可以应用
HL
来解决这个问题,但我不知道如何解决

如果我在这里使用split,那么我将失去解决这个问题的能力,因为我必须在假设的
分支中证明
x=a
,反之亦然。

注意几点:

  • 首先,你的证明太长了。再多想一想,特别是看看你是否在错误的地方做了太多的诱导或分裂

  • 其次,这类重写有点难,但其中一些重写可以通过“Setoids”和iff实现。您可能对
    或\u iff\u compat\l
    引理感兴趣:

      A : Type
      x : A
      l, l' : list A
      a : A
      HL : x = a \/ In a l
      IHl : In a l -> In a (l ++ l')
      ============================
      x = a \/ In a (l ++ l')
    
    或\u iff\u compat\u l:forall A B C:Prop,B C->A\/B A\/C
    
  • 实际上,有些库更喜欢使用布尔版本的
    /\
    \/
    来改进重写

  • 最后,如果您销毁
    HL
    ,您的目标将立即得到证明

有几个注意事项:

  • 首先,你的证明太长了。再多想一想,特别是看看你是否在错误的地方做了太多的诱导或分裂

  • 其次,这类重写有点难,但其中一些重写可以通过“Setoids”和iff实现。您可能对
    或\u iff\u compat\l
    引理感兴趣:

      A : Type
      x : A
      l, l' : list A
      a : A
      HL : x = a \/ In a l
      IHl : In a l -> In a (l ++ l')
      ============================
      x = a \/ In a (l ++ l')
    
    或\u iff\u compat\u l:forall A B C:Prop,B C->A\/B A\/C
    
  • 实际上,有些库更喜欢使用布尔版本的
    /\
    \/
    来改进重写

  • 最后,如果您销毁
    HL
    ,您的目标将立即得到证明

or_iff_compat_l : forall A B C : Prop, B <-> C -> A \/ B <-> A \/ C