Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Isabelle 如何在引理被证明后立即制作一个例子来测试rev_应用程序。自定义引理的开始示例_Isabelle - Fatal编程技术网

Isabelle 如何在引理被证明后立即制作一个例子来测试rev_应用程序。自定义引理的开始示例

Isabelle 如何在引理被证明后立即制作一个例子来测试rev_应用程序。自定义引理的开始示例,isabelle,Isabelle,希望使用子目标运行let定义的列表?aa=[1,2] 并在此aa上运行rev_应用程序,并将值显示为[2,1] theory Scratch2 imports Datatype begin datatype 'a list = Nil ("[]") | Cons 'a "'a list" (infixr "#" 65) (* This is the append function: *) primrec app :: "'a list => 'a li

希望使用子目标运行let定义的列表?aa=[1,2] 并在此aa上运行rev_应用程序,并将值显示为[2,1]

theory Scratch2
imports Datatype
begin
datatype 'a list  = Nil ("[]")
                  | Cons 'a "'a list" (infixr "#" 65)
(* This is the append function: *)
primrec app :: "'a list => 'a list => 'a list" (infixr "@" 65)
where
"[] @ ys = ys" |
"(x # xs) @ ys = x # (xs @ ys)"
primrec rev :: "'a list => 'a list" where
"rev [] = []" |
"rev (x # xs) = (rev xs) @ (x # [])"
primrec itrev :: "'a list => 'a list => 'a list" where
"itrev [] ys = ys" |
"itrev (x#xs) ys = itrev xs (x#ys)"
value "rev (True # False # [])"
lemma app_Nil2 [simp]: "xs @ [] = xs"
apply(induct_tac xs)
apply(auto)
done
lemma app_assoc [simp]: "(xs @ ys) @ zs = xs @ (ys @ zs)"
apply(induct_tac xs)
apply(auto)
done
(第一审)

(第二次审判)

(第三次审讯)


首先,您需要列表枚举的语法(我刚刚在src/HOL/list.thy文件中找到):

那么,您要搜索的是以下内容之一吗

提议1:

lemma example1: "rev [a, b] = [b, a]"
  by simp
这个引理是通过应用simp方法使用的
rev
定义规则来证明的,simp方法重写了左手项,并证明等式的两边相等。这是我更喜欢的解决方案,因为您可以看到,即使不与Isabelle进行评估,示例仍然令人满意

提议2:

value "rev [a, b]" (* return "[b, a]" *)
在这里和命题3中,我们只使用命令
value
来计算
rev

提议3:

value "rev [a, b] = [b, a]" (* returns "True" *)

前面的命题没有使用这个引理:

lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
  apply (induct_tac xs)
  by simp_all
注:

  • 一般来说,您不应该单独导入“Datatype”包,而应该导入“Main”
  • 在您的第一次尝试中,您混合了“应用”(应用…)和“结构化证明”(因此…)样式
  • 如果“?aa”是“[1,2]”,那么“throus?aa”就没有意义,因为“throus”的参数应该是一个子目标,即带有布尔值的命题
  • 为了计算,命令“value”使用ML执行,如果执行失败,则通过计算进行规范化
  • 在示例1中,您可以使用自定义证明和引理(例如:by(simp add:rev_app)

你能让你的问题更精确吗?你想知道如何证明
rev_应用程序
引理,或者你正在搜索一个可以使用
rev_应用程序
引理的例子吗?在你展示的3次尝试中,你到底有什么问题?不,不是我在搜索。如果没有新的引理,rev是默认函数在默认库中,例如,一个自定义引理,我如何在列表中使用这个自定义引理?当您只导入数据类型并创建自己的列表类型时,您没有列表枚举的语法。此外,您甚至不能使用自然数的语法!我将修改我的答案以考虑到这一点。您如何知道rev in值在上面的引理中使用的是rev,而不是默认的rev?我删除了语法和翻译,rev有错误,看起来你的代码真的使用了上面的引理,但是为什么名称不是rev_app,这是否意味着我必须在引理的内容中使用rev_app我修改了我的答案以更清楚。我没有导入
List.thy
(尽管我没有提到它),那么
rev
只能是您定义的一个。但是,如果导入了列表,则将使用最后定义且未隐藏的列表。另一方面,
rev_-app
只是引理的名称,而不是像Coq中那样的函数。您可以使用rev_-app[其中xs=“a”和ys=“b”]但在这种情况下,“a”和“b”应该在某个地方定义。我觉得语法和翻译是如此的专业,如果我没有列表来证明,没有数学或逻辑来证明,语法和翻译会是什么?
lemma example1: "rev [a, b] = [b, a]"
  by simp
value "rev [a, b]" (* return "[b, a]" *)
value "rev [a, b] = [b, a]" (* returns "True" *)
lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
  apply (induct_tac xs)
  by simp_all