Idris 命题不等于的等价物是什么?

Idris 命题不等于的等价物是什么?,idris,Idris,最近,我用重写策略的一些应用程序解决了这个问题。然后,我决定回顾一篇关于代码审查的文章,要求对我试图形式化希尔伯特(基于欧几里得)几何的尝试进行审查 从第一个问题中,我了解到了命题等式和布尔等式以及命题等式之间的区别。回顾我为Hilbert平面编写的一些公理,我广泛地使用了布尔等式。虽然我不是100%确定,但根据我收到的答案,我怀疑我不想使用布尔等式 例如,以这条公理为例: -- There exists 3 non-colinear points. three_non_colinear

最近,我用
重写
策略的一些应用程序解决了这个问题。然后,我决定回顾一篇关于代码审查的文章,要求对我试图形式化希尔伯特(基于欧几里得)几何的尝试进行审查

从第一个问题中,我了解到了命题等式和布尔等式以及命题等式之间的区别。回顾我为Hilbert平面编写的一些公理,我广泛地使用了布尔等式。虽然我不是100%确定,但根据我收到的答案,我怀疑我不想使用布尔等式

例如,以这条公理为例:

  -- There exists 3 non-colinear points.
  three_non_colinear_pts : (a : point ** b : point ** c : point ** 
                           (colinear a b c = False, 
                           (a /= b) = True, 
                           (b /= c) = True, 
                           (a /= c) = True))
我试图重写它,使其不涉及
=True

  -- There exists 3 non-colinear points.
  three_non_colinear_pts : (a : point ** b : point ** c : point ** 
                           (colinear a b c = False, 
                           (a /= b), 
                           (b /= c), 
                           (a /= c)))
interface Plane line point where 
  -- Abstract notion for saying three points lie on the same line.
  colinear : point -> point -> point -> Bool
  coplanar : point -> point -> point -> Bool
  contains : line -> point -> Bool

  -- Intersection between two lines
  intersects_at : line -> line -> point -> Bool

  -- If two lines l and m contain a point a, they intersect at that point.
  intersection_criterion : (l : line) -> 
                           (m : line) ->
                           (a : point) ->
                           (contains l a = True) -> 
                           (contains m a = True) -> 
                           (intersects_at l m a = True)

  -- If l and m intersect at a point a, then they both contain a.
  intersection_result : (l : line) ->
                        (m : line) ->
                        (a : point) ->
                        (intersects_at l m a = True) ->
                        (contains l a = True, contains m a = True)

  -- For any two distinct points there is a line that contains them.
  line_contains_two_points : (a :point) -> 
                             (b : point) ->
                             (a /= b) ->
                             (l : line ** (contains l a = True, contains l b = True ))

  -- If two points are contained by l and m then l = m
  two_pts_define_line : (l : line) ->
                        (m : line) ->
                        (a : point) ->
                        (b : point) ->
                        (a /= b) ->
                        contains l a = True ->
                        contains l b = True ->
                        contains m a = True -> 
                        contains m b = True -> 
                        (l = m)

  same_line_same_pts : (l : line) ->
                       (m : line) ->
                       (a : point) ->
                       (b : point) ->
                       (l /= m) ->
                       contains l a = True ->
                       contains l b = True ->
                       contains m a = True ->
                       contains m b = True ->
                       (a = b)

  -- There exists 3 non-colinear points.
  three_non_colinear_pts : (a : point ** b : point ** c : point ** 
                           (colinear a b c = False, 
                           (a /= b), 
                           (b /= c), 
                           (a /= c)))

  -- Any line contains at least two points.
  contain_two_pts : (l : line) ->
                    (a : point ** b : point ** 
                    (contains l a = True, contains l b = True))

-- If two lines intersect at a point and they are not identical, that is the o-
-- nly point they intersect at.
intersect_at_most_one_point : Plane line point =>
  (l : line) -> (m : line) -> (a : point) -> (b : point) ->
  (l /= m) ->
  (intersects_at l m a = True) ->
  (intersects_at l m b = True) ->
  (a = b)

intersect_at_most_one_point l m a b l_not_m int_at_a int_at_b =
  same_line_same_pts
  l
  m
  a
  b
  l_not_m
  (fst (intersection_result l m a int_at_a))
  (fst (intersection_result l m b int_at_b))
  (snd (intersection_result l m a int_at_a))
  (snd (intersection_result l m b int_at_b))
总之,我从codereview的问题中提取了代码,删除了
=
,并删除了
=True

  -- There exists 3 non-colinear points.
  three_non_colinear_pts : (a : point ** b : point ** c : point ** 
                           (colinear a b c = False, 
                           (a /= b), 
                           (b /= c), 
                           (a /= c)))
interface Plane line point where 
  -- Abstract notion for saying three points lie on the same line.
  colinear : point -> point -> point -> Bool
  coplanar : point -> point -> point -> Bool
  contains : line -> point -> Bool

  -- Intersection between two lines
  intersects_at : line -> line -> point -> Bool

  -- If two lines l and m contain a point a, they intersect at that point.
  intersection_criterion : (l : line) -> 
                           (m : line) ->
                           (a : point) ->
                           (contains l a = True) -> 
                           (contains m a = True) -> 
                           (intersects_at l m a = True)

  -- If l and m intersect at a point a, then they both contain a.
  intersection_result : (l : line) ->
                        (m : line) ->
                        (a : point) ->
                        (intersects_at l m a = True) ->
                        (contains l a = True, contains m a = True)

  -- For any two distinct points there is a line that contains them.
  line_contains_two_points : (a :point) -> 
                             (b : point) ->
                             (a /= b) ->
                             (l : line ** (contains l a = True, contains l b = True ))

  -- If two points are contained by l and m then l = m
  two_pts_define_line : (l : line) ->
                        (m : line) ->
                        (a : point) ->
                        (b : point) ->
                        (a /= b) ->
                        contains l a = True ->
                        contains l b = True ->
                        contains m a = True -> 
                        contains m b = True -> 
                        (l = m)

  same_line_same_pts : (l : line) ->
                       (m : line) ->
                       (a : point) ->
                       (b : point) ->
                       (l /= m) ->
                       contains l a = True ->
                       contains l b = True ->
                       contains m a = True ->
                       contains m b = True ->
                       (a = b)

  -- There exists 3 non-colinear points.
  three_non_colinear_pts : (a : point ** b : point ** c : point ** 
                           (colinear a b c = False, 
                           (a /= b), 
                           (b /= c), 
                           (a /= c)))

  -- Any line contains at least two points.
  contain_two_pts : (l : line) ->
                    (a : point ** b : point ** 
                    (contains l a = True, contains l b = True))

-- If two lines intersect at a point and they are not identical, that is the o-
-- nly point they intersect at.
intersect_at_most_one_point : Plane line point =>
  (l : line) -> (m : line) -> (a : point) -> (b : point) ->
  (l /= m) ->
  (intersects_at l m a = True) ->
  (intersects_at l m b = True) ->
  (a = b)

intersect_at_most_one_point l m a b l_not_m int_at_a int_at_b =
  same_line_same_pts
  l
  m
  a
  b
  l_not_m
  (fst (intersection_result l m a int_at_a))
  (fst (intersection_result l m b int_at_b))
  (snd (intersection_result l m a int_at_a))
  (snd (intersection_result l m b int_at_b))
这会产生以下错误:

  |
1 | interface Plane line point where
  |           ~~~~~~~~~~~~~~~~
When checking type of Main.line_contains_two_points:
Type mismatch between
        Bool (Type of _ /= _)
and
        Type (Expected type)

/home/dair/scratch/hilbert.idr:68:29:
   |
68 | intersect_at_most_one_point : Plane line point =>
   |                             ^
When checking type of Main.intersect_at_most_one_point:
No such variable Plane
因此,
/=
似乎只对布尔值有效。我一直找不到像这样的“命题”
/=

data (/=) : a -> b -> Type where

命题不等于存在吗?或者我想从布尔型变为命题等式是错的?

与布尔型
a/=b
等价的命题是
a=b->Void
Void
是一个没有构造函数的类型。因此,每当你有一个
contra:Void
时,就会出现一些问题。所以
a=b->Void
被理解为:如果你有一个
a=b
,那就有一个矛盾。通常写为
Not(a=b)
,这只是一种简写(
nota=a->Void

你改为命题相等是对的。您甚至可以将布尔属性(如
contains:line->point->Bool
更改为
contains:line->point->Type
)。随后
包含lp=True
包含lp
包含lp=False
不(包含lp)

这是的一个例子,例如,对于
prf:contains lp=True
,我们唯一知道的是
contains lp
True
(编译器需要查看
contains
来猜测它为什么是
True
)。另一方面,使用
prf:Contains l p
你有一个构造的证明
prf
为什么命题
包含l p
成立