Logic 如何有一个比较二者的命题';int';Coq中的类型?
我在Coq的规范文件中有以下定义。我需要一个比较两个“int”类型值的命题。这两个是't'和'Int.repr(i.(period1))'(i.period1)和(i.period2)具有类型'Z' 这是我的代码片段: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)))
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
。