组织isabelle中的约束以建模系统

时间:2014-11-06 20:02:27

标签: isabelle isar

假设我在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中定义这些约束的最佳方法是什么,在某种意义上我可以证明模型的某些属性,假设这些约束适用?

1 个答案:

答案 0 :(得分:2)

撇开您可能需要修复的内容,例如(Person * Car)对不拥有或驱动,您有两种类型,PersonCar没有定义属性对他们来说。

要赋予它们属性,你需要公理,但是你不想使用类似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)