假设我在Isabelle / HOL中有以下表达式:
typedecl Person
typedecl Car
consts age :: "Person ⇒ int"
consts drives ::"(Person × Car) set"
consts owns ::"(Person × Car) set"
这应该模拟Person和Car类型,它们之间有两个关系,名为drives和owns,以及Person的age属性。
我想说每个拥有汽车的人肯定会开车,开车的人都超过17,所以限制:
(∀a. a ∈ owns ⟶ a ∈ drives)
(∀d ∈ drives. age (fst d) > 17)
在Isabelle中定义这些约束的最佳方法是什么,在某种意义上我可以证明模型的某些属性,假设这些约束适用?
答案 0 :(得分:2)
撇开您可能需要修复的内容,例如(Person * Car)
对不拥有或驱动,您有两种类型,Person
和Car
没有定义属性对他们来说。
要赋予它们属性,你需要公理,但是你不想使用类似axiomatization
之类的东西来定义全局公理。
如何使用类型类或语言环境来完成一些公理操作。其他人会想要填写更多细节,但这里有一个简单的模板:
typedecl Person
typedecl Car
locale foo_model =
fixes age :: "Person => int"
fixes drives :: "(Person * Car) set"
fixes owns :: "(Person * Car) set"
assumes owns_axiom: "a ∈ owns --> a ∈ drives"
assumes age_axiom: "∀d ∈ drives. age (fst d) > 17"
begin
lemma some_lemma_you_want: "True"
by(simp)
end
lemma (in foo_model) some_other_lemma_you_want : "True"
by(simp)