我想知道如何证明(So (not (y == y)))
是Uninhabited
的一个实例,我不确定如何去做。它在Idris中是可证明的,或者由于y可能会有一个奇怪的Eq
实现而无法证明?
答案 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)
无人居住很容易。