如何描述Isabelle中(| |)内部的不准确点?

如何描述Isabelle中(| |)内部的不准确点?,isabelle,Isabelle,我知道在Isabelle中,y=x(| I:=1 |)意味着x和y有而且只有一个不同的点,那就是I。非常精确 但是如果我不知道I在y中的值,或者我不能轻松地写出它,该怎么办 我尝试了所有项目的我y=x,但是当有大量的i时,它是丑陋的 我的问题是,我能得到一个像(| |)这样的“精确”表达式吗?,只有几个不准确的点,这样我就不需要为所有项目编写我y=x?我认为您的“所有项目”方法在这里似乎相当合理。也许这比绝对必要的时间要长一点,但至少你的意思很清楚。使用Isabelle语法,您可以编写: "∀i

我知道在Isabelle中,
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⦈