Logic 如何有一个比较二者的命题';int';Coq中的类型?

Logic 如何有一个比较二者的命题';int';Coq中的类型?,logic,coq,compcert,Logic,Coq,Compcert,我在Coq的规范文件中有以下定义。我需要一个比较两个“int”类型值的命题。这两个是't'和'Int.repr(i.(period1))'(i.period1)和(i.period2)具有类型'Z' 这是我的代码片段: Definition trans_uni_r_reject (i: invariant) (om os: block) (rid roff rval t: int) (m: mem) := ( t > (Int.repr (i.(period1)))

我在Coq的规范文件中有以下定义。我需要一个比较两个“int”类型值的命题。这两个是't'和'Int.repr(i.(period1))'(i.period1)和(i.period2)具有类型'Z'

这是我的代码片段:

Definition trans_uni_r_reject (i: invariant) (om os: block) (rid roff rval t: int) (m: mem) :=
  ( t > (Int.repr (i.(period1)))        
 /\ t < (Int.repr (i.(period2)))
 /\  master_eval_reject i om os rid roff rval m).
但它给了我一个错误:

术语“Int.cmpu Cgt(Int.repr(period1 i))”的类型为“bool”,而预期的类型为“Prop”。

有什么方法可以比较这两种“int”类型,或者将它们转换为其他类型并返回“prop”类型


谢谢,

任何
bool
都可以通过将其等同于
true
来转换为
Prop
。在您的示例中,这将导致:

   Int.cmpu Cgt t (Int.repr (i.(period1))) = true
/\ Int.cmpu Clt t (Int.repr (i.(period2))) = true
/\ master_eval_reject i om os rid roff rval m.
如果您在
Int.cmpu
操作符上搜索结果,您可能会在
Int
模块中找到许多引理,它们以
Int.cmpu Cgt x y=true
表示。为此,您可以使用
SearchAbout
命令:

SearchAbout Int.cmpu. (* Looks for all results on Int.cmpu *)
SearchAbout Int.cmpu Cgt (* Looks for all results that mention
                            Int.cmpu and Cgt *)
胁迫 将布尔值等同于
true
是如此普遍,以至于人们经常声明强制使用布尔值,就好像它们是命题一样:

Definition is_true (b : bool) : Prop := b = true.
Coercion is_true : bool >-> Sortclass.
现在,您可以在需要命题的上下文中使用任何布尔值:

   Int.cmpu Cgt t (Int.repr (i.(period1)))
/\ Int.cmpu Clt t (Int.repr (i.(period2)))
/\ master_eval_reject i om os rid roff rval m.
在幕后,Coq会围绕这些事件插入不可见的调用
is\u true
。不过,你应该意识到,胁迫仍然以你的方式出现。您可以通过发出一个特殊命令来看到这一点

Set Printing Coercions.
这将向您显示Coq看到的上述代码段:

   is_true (Int.cmpu Cgt t (Int.repr (i.(period1))))
/\ is_true (Int.cmpu Clt t (Int.repr (i.(period2))))
/\ master_eval_reject i om os rid roff rval m.
(要撤消上一步,只需运行
取消打印强制


由于默认情况下不会打印强制,因此有效使用强制可能需要一些时间。Coq库大量使用
is_true
作为强制,并提供了特别支持,使其更易于使用。如果你感兴趣,我建议你看看

任何
bool
都可以通过将其等同于
true
来转换为
Prop
。在您的示例中,这将导致:

   Int.cmpu Cgt t (Int.repr (i.(period1))) = true
/\ Int.cmpu Clt t (Int.repr (i.(period2))) = true
/\ master_eval_reject i om os rid roff rval m.
如果您在
Int.cmpu
操作符上搜索结果,您可能会在
Int
模块中找到许多引理,它们以
Int.cmpu Cgt x y=true
表示。为此,您可以使用
SearchAbout
命令:

SearchAbout Int.cmpu. (* Looks for all results on Int.cmpu *)
SearchAbout Int.cmpu Cgt (* Looks for all results that mention
                            Int.cmpu and Cgt *)
胁迫 将布尔值等同于
true
是如此普遍,以至于人们经常声明强制使用布尔值,就好像它们是命题一样:

Definition is_true (b : bool) : Prop := b = true.
Coercion is_true : bool >-> Sortclass.
现在,您可以在需要命题的上下文中使用任何布尔值:

   Int.cmpu Cgt t (Int.repr (i.(period1)))
/\ Int.cmpu Clt t (Int.repr (i.(period2)))
/\ master_eval_reject i om os rid roff rval m.
在幕后,Coq会围绕这些事件插入不可见的调用
is\u true
。不过,你应该意识到,胁迫仍然以你的方式出现。您可以通过发出一个特殊命令来看到这一点

Set Printing Coercions.
这将向您显示Coq看到的上述代码段:

   is_true (Int.cmpu Cgt t (Int.repr (i.(period1))))
/\ is_true (Int.cmpu Clt t (Int.repr (i.(period2))))
/\ master_eval_reject i om os rid roff rval m.
(要撤消上一步,只需运行
取消打印强制


由于默认情况下不会打印强制,因此有效使用强制可能需要一些时间。Coq库大量使用
is_true
作为强制,并提供了特别支持,使其更易于使用。如果你感兴趣,我建议你看看

谢谢你,亚瑟!正如你所建议的,我宣布了一项胁迫,这解决了我的问题除了Arthur出色的回答之外,我还想指出,用
证明是真的
导致了一种用重写来证明的风格,因为实际上你可以将
a=true
重写为
true=true
。谢谢Arthur!正如你所建议的,我宣布了一项胁迫,这解决了我的问题除了Arthur出色的回答之外,我还想指出,用
证明是真的
导致了一种用重写来证明的风格,因为实际上你可以将
a=true
重写为
true=true