如何证明一个类型的布尔不等式在Idris中无人居住?

时间:2017-07-02 07:25:43

标签: dependent-type idris

我想知道如何证明(So (not (y == y)))Uninhabited的一个实例,我不确定如何去做。它在Idris中是可证明的,或者由于y可能会有一个奇怪的Eq实现而无法证明?

2 个答案:

答案 0 :(得分:3)

Eq接口不要求实现遵循正常的平等法则。但是,我们可以定义一个扩展的LawfulEq接口:

%default total

is_reflexive : (t -> t -> Bool) -> Type
is_reflexive {t} rel = (x : t) -> rel x x = True

is_symmetric : (t -> t -> Bool) -> Type
is_symmetric {t} rel = (x : t) -> (y : t) -> rel x y = rel y x

is_transitive : (t -> t -> Bool) -> Type
is_transitive {t} rel = (x : t) -> (y : t) -> (z : t) -> rel x y = True -> rel x z = rel y z

interface Eq t => LawfulEq t where
  eq_is_reflexive : is_reflexive {t} (==)
  eq_is_symmetric : is_symmetric {t} (==)
  eq_is_transitive : is_transitive {t} (==)

问题中要求的结果可以证明类型为Bool

so_false_is_void : So False -> Void
so_false_is_void Oh impossible

so_not_y_eq_y_is_void : (y : Bool) -> So (not (y == y)) -> Void
so_not_y_eq_y_is_void False = so_false_is_void
so_not_y_eq_y_is_void True = so_false_is_void

对于以下Weird类型,结果可能证明不正确:

data Weird = W

Eq Weird where
  W == W = False

weird_so_not_y_eq_y : (y : Weird) -> So (not (y == y))
weird_so_not_y_eq_y W = Oh

可以证明Weird (==)不具有反身性,因此无法实现LawfulEq Weird

weird_eq_not_reflexive : is_reflexive {t=Weird} (==) -> Void
weird_eq_not_reflexive is_reflexive_eq = 
  let w_eq_w_is_true = is_reflexive_eq W in
    trueNotFalse $ trans (sym w_eq_w_is_true) (the (W == W = False) Refl)

答案 1 :(得分:1)

Shersh是对的:你做不到。 (==)的实现不能保证是自反的,所以可能不是这样。

您可以限制y的类型,以便证明(==)的具体实施属性,但我怀疑您要使用decEq(=)而不是So(==)。显示Not (y = y)无人居住很容易。