在某些情况下假设为假时如何证明使用案例拆分?

How to prove using case splitting when hypothesis is false in some cases?

我正在做一些关于 Idris 证明的练习,我在各种练习中一直 运行 解决同一个问题。我先笼统的描述一下问题,再举个具体的例子:

theorem: (some variables) -> (hypothesis using those variables) -> (proof goal)

现在假设我想使用案例拆分给出证明,并且在某些情况下变量的分配使假设为假。这意味着这种情况永远不会发生,因此可以继续证明。但是如何告诉伊德里斯呢?

例如:

andb_true_elim_2 : (b, c: Bool) -> (b && c = True) -> c = True
andb_true_elim_2 True c prf = prf -- This is OK!
andb_true_elim_2 False c prf = ?hole -- This is the problem

由于 b 为假,b && c = True 的计算结果为 False = True,这是不可能的,因此 prf 永远不会有达到这种情况的有效值,所以这无关紧要。

如何解决这类问题?

谢谢!

如果您尝试将证明与 Refl 进行模式匹配,Idris 会发现这是不可能的。然后您可以使用 impossible 关键字告诉 Idris 不要担心它。

andb_true_elim_2 : (b, c: Bool) -> (b && c = True) -> c = True
andb_true_elim_2 True c prf = prf
andb_true_elim_2 False c Refl impossible