如何描述Isabelle中(| |)内部的不准确点?
我知道在Isabelle中,如何描述Isabelle中(| |)内部的不准确点?,isabelle,Isabelle,我知道在Isabelle中,y=x(| I:=1 |)意味着x和y有而且只有一个不同的点,那就是I。非常精确 但是如果我不知道I在y中的值,或者我不能轻松地写出它,该怎么办 我尝试了所有项目的我y=x,但是当有大量的i时,它是丑陋的 我的问题是,我能得到一个像(| |)这样的“精确”表达式吗?,只有几个不准确的点,这样我就不需要为所有项目编写我y=x?我认为您的“所有项目”方法在这里似乎相当合理。也许这比绝对必要的时间要长一点,但至少你的意思很清楚。使用Isabelle语法,您可以编写: "∀i
y=x(| I:=1 |)
意味着x
和y
有而且只有一个不同的点,那就是I
。非常精确
但是如果我不知道I
在y
中的值,或者我不能轻松地写出它,该怎么办
我尝试了所有项目的我y=x
,但是当有大量的i
时,它是丑陋的
我的问题是,我能得到一个像(| |)这样的“精确”表达式吗?
,只有几个不准确的点,这样我就不需要为所有项目编写我y=x
?我认为您的“所有项目”方法在这里似乎相当合理。也许这比绝对必要的时间要长一点,但至少你的意思很清楚。使用Isabelle语法,您可以编写:
"∀i ∈ -{2,3,5}. f i = g i"
说明f
和g
仅在输入2
、3
和5
上不同。(-
表示集合的补充。)我认为你的“所有项目”方法在这里似乎很合理。也许这比绝对必要的时间要长一点,但至少你的意思很清楚。使用Isabelle语法,您可以编写:
"∀i ∈ -{2,3,5}. f i = g i"
说明
f
和g
仅在输入2
、3
和5
上不同。(-
表示集合的补码。)如果您特别询问记录,那么这可能不是正确的答案。我只看了“8.2记录”[]就足以试着弄明白你在说什么
如果你问,“我如何避免重复输入同样的、冗长的、令人讨厌的语法,使我的定理变得杂乱无章?”那么我可能会对你的问题有一个答案
简短回答:如果需要包含常用长公式的实用语法,请使用Isar命令缩写
、符号
和语法
,为函数和常量设置符号。一开始,您将为这些命令的语法而苦苦挣扎,但痛苦终将得到回报
另一个简短的回答:如果你已经知道了你的公式是什么,比如你的所有项目的我y=x
,它是一个谓词或其他一些公式,在你的许多公式中,那么我下面说的话适用,而且,如果你能定义一个缩写来消除很多混乱,尽管可能不是全部
如果你看这个例子,你会发现他们定义了一点符号,使事情变得更方便
当您希望缩写的扩展自动成为引理的一部分时,需要记住的一件重要事情是使用缩写
而不是定义
我对记录的简要回顾
在简单地看了8.2中的记录之后,这是一个很好的信息,我不太明白你的第一句话。我没有看到任何显示我可以使用变量作为字段名的内容,如下所示:
term "x(| (i::int point_scheme => int) := 1 |)".
∀u. x⦇i := u⦈ = y⦇i := u⦈
因此,我从[]中选取点
示例,并指定以下条件,以尝试得出一个接近您第一句话的示例:
x = p1, y = p2, i = Xcoord
(Ycoord p1) = (Ycoord p2) & p2 = p1(|Xcoord := 1|), or
p2 = p1(|Xcoord := 1, Ycoord := 1|)
以下我的缩写将与第一个缩写类似:
xCONDyEQ(p1, p2, P) ==> p2 = p1(|Xcoord := 1|).
例如,如果p=(%i.0
,则该语句为真。我的例子并不是为了解决你的特殊问题。我发现,要找到一个很好的解决方案,需要努力找到专门的符号
我的示例来源如下。如果我试图优化语法,那么我所展示的示例肯定不是我最终的选择。我会选择更多的图形符号,但这不适合SO和示例
另外,在引理xp1
和xp2
中,我传递一个函数,并且我必须在公式中使用p1
和p2
两次,这让我很恼火。然而,如果我花了8个小时试图想出一个更干净的解决方案,我会花8个小时来定义你的符号,因为这是个人喜好,你可能会讨厌它,我不清楚你在问什么
实际上,我又花了n
分钟使用syntax
重载表示法,以获得以下等价形式,其中两种表示法都是同一函数的缩写:
xpCOND(p,P) = xCONDyEQ(p,p,P)
ypCOND(p,P) = yCONDxEQ(p,p,P)
是语法
命令会让你痛苦数小时甚至数天。做了这件事让我更接近于不用费劲思考就能完成这件事
我在这里对符号和语法的回答表明,这些问题的解决方案是特定于应用程序的,需要集思广益想出一个体面的解决方案的是用户,而不是开发人员,以避免使用大量语法来陈述定理
你不一定想尝试变得太花哨。您可以定义语法以获得较短的语法,但它可能太具体,因为您定义的专门语法太多。我下面的例子xp4
就是试图说明这一点
最近,我决定像isP\u和seq(D,C,x,y)
这样的东西比像isP(D,C)==>x=y
这样的东西更糟糕。我们的想法是尽可能多地使用Isabelle/HOL的标准语法
(******************************************************************************)
(* POINT RECORD: **************************************************************)
record point =
Xcoord :: int
Ycoord :: int (*page 154 of tutorial.pdf*)
(******************************************************************************)
(* ABBREVIATIONS: *************************************************************)
(* xCONDyEQ(p1, p2, x coord property fun), p1 and p2 y coordinates are equal.**)
(* yCONDxEQ(p1, p2, y coord property fun), p1 and p2 x coordinates are equal.**)
(******************************************************************************)
abbreviation (input) point_0_0 :: "point" where
"point_0_0 == (|Xcoord = 0, Ycoord = 0|)"
notation
point_0_0 ("'(||')")
abbreviation (input) p2_x_cond_y_eq
:: "point => point => (int => bool) => bool" where
"p2_x_cond_y_eq p1 p2 P == P(Xcoord p2) ∧ (Ycoord p1 = Ycoord p2)"
notation (input)
p2_x_cond_y_eq ("xCONDyEQ'(_, _, _')")
syntax
"_xcond" :: "point => (int => bool) => bool" ("xpCOND'(_, _')")
translations
"xpCOND(p,P)" => "xCONDyEQ(p,p,P)"
abbreviation p2_y_cond_x_eq :: "point => point => (int => bool) => bool"
where "p2_y_cond_x_eq p1 p2 P == P(Ycoord p2) ∧ (Xcoord p1 = Xcoord p2)"
notation (input)
p2_y_cond_x_eq ("yCONDxEQ'(_, _, _')")
syntax
"_ycond" :: "point => (int => bool) => bool" ("ypCOND'(_, _')")
translations
"ypCOND(p,P)" => "yCONDxEQ(p,p,P)"
lemma xp1:
"xCONDyEQ(p1, p2, (%i. i > 0 & i < 2)) ==> p2 = p1(|Xcoord := 1|)"
by(auto)
lemma xp2:
"xpCOND(p2, (%i. i = 0)) &
ypCOND(p2, (%i. i = 0)) ==> p2 = (||)"
by(auto)
lemma xp3:
"xCONDyEQ(p1, p2, (%i. i > 0 & i < 2)) &
yCONDxEQ(p1, p2, (%i. i > 0 & i < 2))
==> p2 = p1(|Xcoord := 1, Ycoord := 1|)"
by(auto)
(******************************************************************************)
(* ALL-IN-ONE OPERATOR ********************************************************)
(******************************************************************************)
(*It's tempting to want to put bool operators in your abbreviated function, but
it may be better to figure out a predicate to be used with ==>, so that you
have `P p2 ==> f p1 p2*)
abbreviation O_p2_x_cond_y_eq :: "point => point => (int => bool) => bool"
where "O_p2_x_cond_y_eq p1 p2 P ==
P(Xcoord p2) ∧ (Ycoord p1 = Ycoord p2) --> p1 = p2"
notation (input)
O_p2_x_cond_y_eq ("xCONDyEQ'_yEQ'(_, _, _')")
lemma xp4:
"xCONDyEQ_yEQ( p1(|Xcoord := 1|), p2, (%i. i > 0 & i < 2) )"
by(simp)
(***************************************************************************************************************************************
(*点记录:***********************************************************************************************************************)
记录点=
Xcoord::int
Ycoord::int(*教程第154页,pdf*)
(******************************************************************************)
(*缩写:*****************************************************************************************)
(*xCONDyEQ(p1,p2,x坐标),p1和p2 y坐标相等。**)
(*yCONDxEQ(p1,p2,y坐标),p1和p2 x坐标等于
y = x⦇i := i y⦈