我可以使用类和语言环境代数构造一个while结构吗?

时间:2019-05-15 14:14:48

标签: isabelle formal-verification

我是从代数结构构造程序语句,而不是使用定义或函数,而是使用区域设置或类命令在Isabelle中设置其属性。
现在,我需要构造一个while语句。

我知道我可以在函数命令中定义它,也可以使用克列烯代数定义它。但是,正如我之前所说,我只想描述类或语言环境的性质。
所以我写了这段代码:

consts skip  :: "'a" ("II")
type_synonym 'a proc = "'a "

class sequen = 
  fixes seq :: "'a proc ⇒'a proc  ⇒'a proc " (infixl ";;" 60)
  assumes seq_assoc : "(x ;; y) ;; z = x ;; (y ;; z)"
      and seq_skip_left : "II ;; x = x"
      and seq_skip_right : "x ;; II = x" 

definition ifprog :: " 'a proc  ⇒ bool ⇒ 'a proc  ⇒ 'a proc "  ("(_ ◃ _ ▹ _)" [52,0,53] 52)
  where "x ◃ bexp ▹ y ≡ (THE z::'a proc . (bexp = True ⟶ z = x) ∧ (bexp = False ⟶ z = y))"

locale while_unfold =
  sequen seq 
  for seq :: "'a proc ⇒'a proc  ⇒'a proc " +
  fixes while ::"bool ⇒ 'a proc ⇒ 'a proc" ("while _ do _ od")
  assumes while_ltera : "while bexp do P od =  (P ;; (while bexp do P od)) ◃ bexp ▹ II"

如果可能的话,我不会在这里问问题,我有问题:
Type unification failed: Variable 'a::type not of sort sequen

然后,这些详细信息是:

  

类型统一失败:变量'a :: type不是排序序列

     

应用程序中的类型错误:操作数类型不兼容

     

运算符:(;;):: ??'a⇒??'a⇒??'a
  操作数:P ::'a

如何避免此问题,或者可以使用这种描述性方法构造具有迭代功能的语句,例如while

1 个答案:

答案 0 :(得分:0)

我没有查看类/语言环境的内容,但是错误消息似乎是不言自明的:由于类型变量'a的排序约束不兼容,类型统一失败。除非您依赖类型推断,否则需要显式提供排序约束:

consts skip  :: "'a" ("II")
type_synonym 'a proc = "'a "

class sequen = 
  fixes seq :: "'a proc ⇒'a proc  ⇒'a proc " (infixl ";;" 60)
  assumes seq_assoc : "(x ;; y) ;; z = x ;; (y ;; z)"
      and seq_skip_left : "II ;; x = x"
      and seq_skip_right : "x ;; II = x" 

(*sequen_class.seq has the type 
"'a::sequen ⇒ 'a::sequen ⇒ 'a::sequen",
 which includes the sort constraint sequen for the type variable 'a:*)
declare [[show_sorts]]
term sequen_class.seq

definition ifprog :: " 'a proc  ⇒ bool ⇒ 'a proc  ⇒ 'a proc "  ("(_ ◃ _ ▹ _)" [52,0,53] 52)
  where "x ◃ bexp ▹ y ≡ (THE z::'a proc . (bexp = True ⟶ z = x) ∧ (bexp = False ⟶ z = y))"

(*note the sort constraint*)
locale while_unfold =
  sequen seq 
  for seq :: "'a::sequen proc ⇒'a proc  ⇒'a proc " +
  fixes while ::"bool ⇒ 'a proc ⇒ 'a proc" ("while _ do _ od")
  assumes while_ltera : "while bexp do P od =  (P ;; (while bexp do P od)) ◃ bexp ▹ II"

(*alternatively, consider using a class instead of a locale, although,
most certainly, the best choice depends on your application*)
class while_unfold' =
  sequen +
  fixes while ::"bool ⇒ 'a proc ⇒ 'a proc" ("while _ do _ od")
  assumes while_ltera : "while bexp do P od =  (P ;; (while bexp do P od)) ◃ bexp ▹ II"

有关类和排序约束的更多信息,请参见《 Isabelle / Isar参考手册》中的3.3.6和5.8节。您还可以查看Isabelle / Isar实施中的第2节。