在isabelle中组织约束以对系统建模

在isabelle中组织约束以对系统建模,isabelle,isar,Isabelle,Isar,假设我在Isabelle/HOL中有以下表达式: typedecl Person typedecl Car consts age :: "Person ⇒ int" consts drives ::"(Person × Car) set" consts owns ::"(Person × Car) set" 这是为了模拟人和车的类型,它们之间有两个关系,命名为drives和own,以及人的年龄属性 我想声明的是,所有拥有汽车的人都肯定会驾驶汽车,而且驾驶汽车的人都超过17岁,因此限制条件如

假设我在Isabelle/HOL中有以下表达式:

typedecl Person
typedecl Car

consts age :: "Person ⇒ int" 
consts drives ::"(Person × Car) set"
consts owns ::"(Person × Car) set"
这是为了模拟人和车的类型,它们之间有两个关系,命名为drives和own,以及人的年龄属性

我想声明的是,所有拥有汽车的人都肯定会驾驶汽车,而且驾驶汽车的人都超过17岁,因此限制条件如下:

(∀a. a ∈ owns ⟶ a ∈ drives)
(∀d ∈ drives. age (fst d) > 17)

在Isabelle中定义这类约束的最佳方法是什么?在这个意义上,我可以证明模型上的一些属性,假设这些约束成立?

将可能需要修复的东西放在一边,例如,
(人*车)
对不拥有或驾驶,您有两种类型,
Person
Car
没有为其定义属性

要赋予它们属性,您需要公理,但不希望使用类似于
公理化的东西来定义全局公理

您要做的是使用类型类或区域设置来执行一些axiom操作。其他人可能希望填写更多详细信息,但这里有一个基本模板:

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)