如何定义映射映射?

时间:2017-08-17 06:40:54

标签: isabelle

理论中有两种值 - val1val2

type_synonym bool3 = "bool option"

datatype val1 = BVal1 bool3 | IVal1 int | SVal1 string
datatype val2 = BVal2 bool | IVal2 int

我可以使用以下归纳谓词映射它们:

inductive map_val_ind :: "val1 ⇒ val2 ⇒ bool" where
  "map_val_ind (BVal1 (Some v)) (BVal2 v)"
| "map_val_ind (IVal1 v) (IVal2 v)"

code_pred [show_modes] map_val_ind .

values "{t. map_val_ind (BVal1 (Some True)) t}"

或以下功能:

fun map_val :: "val1 ⇒ val2 option" where
  "map_val (BVal1 (Some v)) = Some (BVal2 v)"
| "map_val (IVal1 v) = Some (IVal2 v)"
| "map_val _ = None"

value "map_val (BVal1 (Some True))"

我更喜欢归纳谓词,因为它是双向的。

另外,我需要映射变量的环境:

type_synonym vname = "string"
type_synonym 'a env = "vname ⇒ 'a option"

1)这是第一次定义映射的尝试:

definition map_env :: "val1 env ⇒ val2 env ⇒ bool" where
  "map_env env1 env2 ≡ ∀x. ∃y z.
    env1 x = Some y ∧
    env2 x = Some z ∧
    map_val_ind y z"

问题在于它不具有建设性,我不明白如何使用此定义映射环境。

2)这是一个功能定义:

definition map_env_fun :: "val1 env ⇒ (val2 env) option" where
  "map_env_fun env = (if ∀x. ∃y z. env x = Some y ∧ map_val y = Some z
    then Some (λx. map_val (the (env x)))
    else None)"

value "map_env_fun [''x'' ↦ BVal1 (Some True)]"

但是我收到以下错误:

Wellsortedness error
(in code equation map_env_fun ?env ≡
                  if ∀x. ∃y z. equal_option_inst.equal_option (?env x) (Some y) ∧
                               equal_option_inst.equal_option (map_val y) (Some z)
                  then Some (λx. map_val (the (?env x))) else None,
with dependency "Pure.dummy_pattern" -> "map_env_fun"):
Type char list not of sort enum
No type arity list :: enum

3)这是一个归纳版本:

inductive map_env_ind :: "val1 env ⇒ val2 env ⇒ bool" where
  "env1 x = Some y ⟹
   env2 x = Some z ⟹
   map_val_ind y z ⟹
   map_env_ind env1 env2"

code_pred [show_modes] map_env_ind .

问题是code_pred无法推断出任何执行模式。

如何定义这样的环境映射?我更喜欢归纳版本,因为它是双向的,并且更容易证明归纳谓词的引理。

0 个答案:

没有答案