跳到内容
导航菜单
切换导航
登录
产品
行动
自动化任何工作流
包装
托管和管理包
安全
查找并修复漏洞
代码空间
即时开发环境
副驾驶员
使用AI编写更好的代码
代码审查
管理代码更改
问题
计划和跟踪工作
讨论
在代码外协作
探索
所有功能
文档
GitHub技能
博客
解决
对于
企业
团队
创业公司
教育类
按解决方案
CI/CD和自动化
开发操作
开发安全操作
资源
学习途径
白皮书、电子书、网络研讨会
客户案例
合作伙伴
开放源代码
GitHub赞助商
资助开源开发人员
ReadME项目
GitHub社区文章
存储库
话题
趋向
收藏
定价
搜索或跳转到。。。
搜索代码、存储库、用户、问题、推送请求。。。
搜索
清除
搜索语法提示
提供反馈
我们阅读了每一条反馈,并非常认真地对待您的意见。
包括我的电子邮件地址以便联系我
保存的搜索
使用保存的搜索更快地筛选结果
姓名
查询
要查看所有可用的限定符,请参阅我们的
文档
.
登录
注册
您使用另一个选项卡或窗口登录。
重新加载
刷新会话。
您在另一个选项卡或窗口中注销。
重新加载
刷新会话。
您在另一个选项卡或窗口上切换了帐户。
重新加载
刷新会话。
解除警报
{{消息}}
萨缪尔格鲁特
/
点微积分
公共
通知
福克
9
星星
62
代码
问题
0
Pull请求
0
行动
项目
0
安全
洞察力
其他导航选项
代码
问题
Pull请求
行动
项目
安全
洞察力
文件夹
主人
面包屑
点微积分
/
稳定的
/
stable_typ-cbmode-precise-gDot。
v(v)
责备
责备
最新提交
历史
历史
4717行(4361位)·169 KB
主人
面包屑
点微积分
/
稳定的
/
stable_typ-cbmode-precise-gDot。
v(v)
顶部
文件元数据和控件
代码
责备
4717行(4361位)·169 KB
原始
1
2
三
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
设置
隐性的
论据
.
(*
CoqIDE用户:运行open.sh(in./ln)启动CoqIDE,然后打开此文件。
*)
要求
导入
利伯兰。
(*
######################################################################
*)
(*
######################################################################
*)
(*
**定义
*)
(*
######################################################################
*)
(*
***语法
*)
参数
typ_label:设置。
参数
mtd_lable:设置。
感应式
标签:
设置
:=
|标签类型:类型标签->标签
|label_mtd:mtd_labe->标签。
感应式
阿瓦尔:
设置
:=
|avar_b:nat->avar
(*
绑定变量(de Bruijn索引)
*)
|avar_f:var->avar。
(*
自由变量(“name”),指存储或ctx
*)
感应式
类型:
设置
:=
|typ_top:典型
|typ_bot:典型
|typ_rcd:dec->类型
(*
{D}(D)
*)
|typ_sel:avar->typ_label->typ(*x.L*)
|类型_和:类型->类型->类型
|类型或:类型->类型->类型
具有
十二月:
设置
:=
|dec_typ:典型标签->典型->典型->dec(*L:S.U*)
|dec_mtd:mtd_lable->典型->典型->dec(*m:S->U*)。
感应式
列车长:
设置
:=
|trm_var:avar->trm
|trm_new:defs->trm->trm(*val x=新{…}
在里面
t*)
|trm_call:trm->mtd_label->trm->trm(*t1.m(t2)*)
具有
定义:
设置
:=
|定义类型:类型标签->类型->定义
(*
此处只允许类型别名
*)
|定义mtd:mtd标签->类型->类型->trm->定义
(*
一个无名的论点
*)
具有
定义:
设置
:=
|defs_nil:定义
|defs_cons:defs->def->defs。
(*
****键入环境(“Gamma”)
*)
定义
ctx:=环境类型。
(*
****价值环境(“商店”)
*)
定义
sto:=环境定义。
(*
****TODO句法糖
*)
(*
######################################################################
*)
(*
***定义列表成员
*)
定义
label_of_def(d:def):标签:=
比赛
d日
具有
|定义类型L_=>标签类型L
|def_mtd m _ _=>标签_ mtd m
结束
.
定义
label_of_dec(D:dec):标签:=
比赛
D类
具有
|dec_typ L__=>标签_类型L
|dec _ mtd m _ _=>标签m
结束
.
固定点
get_def(l:label)(ds:defs):选项定义:=
比赛
ds公司
具有
|defs_nil=>无
|defs_cons ds'd=>
如果
标签定义d=l
然后
一些d
其他的
获取_ def l ds’
结束
.
定义
defs_has(ds:defs)(d:def):=get_def(label_of_def d)ds=一些d。
定义
defs_hasnt(ds:defs)(l:label):=get_def l ds=无。
(*
######################################################################
*)
(*
***打开
*)
(*
*在某些语法中,Opening用悬空索引(k)替换绑定变量
通过自由变量x。
*)
定义
open_rec_avar(k:nat)(u:var)(a:avar):avar:=
比赛
一
具有
|avar_b i=>
如果
k=i
然后
可用性
其他的
avar_b i
|avar_f x=>avar_f x
结束
.
固定点
open_rec_typ(k:nat)(u:var)(T:typ):类型:=
比赛
T型
具有
|typ_top=>典型顶部
|typ_bot=>类型_bot
|typ_rcd D=>typ_rbd(open_rec_dec k u D)
|典型_选择x L=>典型_选择(open_rec_avar k u x)L
|类型_和T1 T2=>类型_和(open_rec_typ k u T1)(open_rc_typ k u T2)
|类型_或T1 T2=>类型_或(open_rec_typ k u T1)(open_rc_typ k u T2)
结束
具有
open_rec_dec(k:nat)(u:var)(D:dec):删除:=
比赛
D类
具有
|dec_typ L T U=>dec_typ L(open_rec_typ k U T)(open_rc_typ k U U)
|dec_mtd m T U=>dec_mitd m(open_rec_typ k U T)(open_rc_typ k U U)
结束
.
固定点
open_rec_trm(k:nat)(u:var)(t:trm):trm:=
比赛
t吨
具有
|trm_var a=>trm_val(打开rec_avar ku a)
|trm_callo m a=>trm_call(open_rec_trm ku o)m(open_rc_trm k u a)
|trm_new ds t=>trm_now(open_rec_defs(S k)u ds)
(*
自我参照
*)
(打开_ rec_trm(S k)u t)
结束
具有
open_rec_def(k:nat)(u:var)(d:def):定义:=
比赛
d日
具有
|定义类型L T=>定义类型L(open_rec_typ k u T)
|def_mtd m T1 T2 e=>def_mtd m(open_rec_typ k u T1)(open_rc_typ k u T2)
(打开_ rec_trm(S k)u e)
结束
具有
open_rec_defs(k:nat)(u:var)(ds:defs):定义:=
比赛
ds公司
具有
|defs_nil=>定义_nil
|defs_cons tl d=>defs_con(open_rec_defs k u tl)(open_rc_def k u d)
结束
.
定义
open_avar u a:=open_rec_avar 0 u a。
定义
open_typ u t:=open_rec_typ 0 u t。
定义
open_dec u D:=open_rec_dec 0 u D。
定义
open_trm u e:=open_rec_trm 0 u e。
定义
open_def u d:=open_rec_def 0 u d。
定义
open_defs u l:=open_rec_defs 0 u l。
(*
######################################################################
*)
(*
***自由变量
*)
定义
fv_avar(a:avar):变量:=
比赛
一
具有
|avar_b i=>\{}
|avar_f x=>\{x}
结束
.
固定点
fv_typ(T:typ):变量:=
比赛
T型
具有
|典型顶部=>\{}
|类型_机器人=>\{}
|典型_rcd D=>(fv_dec D)
|典型_选择x L=>(fv_avar x)
|类型_和T U=>(fv_typ T)\U(fv_typ U)
|类型_或T U=>(fv_typ T)\U(fv_typ U)
结束
具有
fv_dec(D:dec):变量:=
比赛
D类
具有
|dec_typ L T U=>(fv_typ T)\U(fv_typ U)
|dec_mtd m T U=>(fv_typ T)\U(fv_typ U)
结束
.
(*
因为我们自己定义了def,而不是使用[list-def],所以我们没有任何定义
防终止问题:
*)
固定点
fv_trm(t:trm):变量:=
比赛
t吨
具有
|trm_var x=>(fv_avar x)
|trm_new ds t=>(fv_defs ds)\u(fv_trm t)
|trm调用t1 m t2=>(fv_trm t1)\u(fv_trm t2)
结束
具有
fv_def(d:def):变量:=
比赛
d日
具有
|定义类型T=>(fv_typ T)
|def_mtd_ T U=>(fv_typ T)\U(fv_typ U)\U
结束
具有
fv_defs(ds:defs):变量:=
比赛
ds公司
具有
|defs_nil=>\{}
|defs_cons tl d=>(fv_defs tl)\u(fv_def d)
结束
.
定义
fv_ctx_types(G:ctx):变量:=(fv_in_values(fun T=>fv_typ T)G)。
(*
######################################################################
*)
(*
***操作语义
*)
(*
*注意:用户给出的术语是封闭的,所以它们只包含avar_b,不包含avar_f。
每当我们引入新的avar_f(仅在red_new中发生)时,我们都会选择一个
它不在商店里,所以我们从来没有名字冲突。
*)
感应式
红色:trm->sto->trm->to->
道具
:=
(*
计算规则
*)
|red_call:对于所有s x y m T U ds主体,
绑定x ds s->
defs_has ds(def_mtd m T U车身)->
红色(trm_call(trm_var(avar_f x))m(trmvar(evar_f y))s
(open_trm y主体)s
|red_new:对于所有s ds t x,
x#s->
红色(trm新ds t)s
(open_trm x t)(s&x~(open_defs x ds))
(*
同余规则
*)
|red_call1:对于所有的“o”,
红色o s o’s’->
红色(trm呼叫oma)
(trm_call o'ma)s'
|red_call2:对于所有s x m a s“a”,
红色a是a的'->
红色(trmcall(trmvar(avar_f x))ma)s
(trm_call(trm_var(avar_f x))m a’)s’。
(*
######################################################################
*)
(*
***键入
*)
(*
返回(选项dec),因为它不是总数。
*)
定义
intersect_dec(D1 D2:dec):选项dec:=
如果
label_of_dec D1=标记D2
然后
比赛
D1、D2
具有
|(下降类型L S1 U1),(下降类型_ S2 U2)
=>一些(dec_typ L(典型_或S1 S2)(典型_和U1 U2))
|(减米S1 U1),(减米S2 U2)
=>一些(dec_mtd m(典型_或S1 S2)(典型_和U1 U2))
|_,_=>无
结束
其他的
没有。
定义
union_dec(D1 D2:dec):选项dec:=
如果
label_of_dec D1=标记D2
然后
比赛
D1、D2
具有
|(下降类型L S1 U1),(下降类型_ S2 U2)
=>一些(dec_typ L(典型_和S1 S2)(典型_或U1 U2))
|(dec_mtd m S1 U1),(dec_mtd _ S2 U2)
=>一些(dec_mtd m(典型_和S1 S2)(典型_或U1 U2))
|_,_=>无
结束
其他的
没有。
符号
“D1&&D2==D3”:=(intersect_dec D1 D2=部分D3)(40级)。
符号
“D1||D2==D3”:=(union_dec D1 D2=部分D3)(40级)。
定义
dec_bot(l:标签):dec:=
比赛
我
具有
|label_typ L=>dec_typ L typ_top typ_bot标签类型
|标签mtd m=>dec_mtd m典型顶部典型底部
结束
.
感应式
典型值:ctx->典型值->dec->
道具
:=
(*
|typ_top_has:typ_top没有任何内容
*)
|typ_bot_has:对于所有G l,
typ_has G类型_bot(dec_bot l)
|typ_rcd_has:对于所有G D,
典型_具有G(典型_ rcd D)D
|typ_sel_has:对于所有G x T L Lo-Hi D,
绑定x T G->
典型_has G T(dec_typ L Lo-Hi)->
典型_具有G高D->
典型_具有G(典型_选择(avar_f x)L)D
|typ_and_has_1:对于所有G T1 T2 D,
典型_有G T1 D->
典型相G T2(标签_of_dec D)->
典型_具有G(典型_和T1 T2)D
|typ_and_has_2:对于所有G T1 T2 D,
典型相位G T1(标记D)->
典型_具有G T2 D->
典型_具有G(典型_和T1 T2)D
|typ_and_has_12:对于所有G T1 T2 D1 D2 D3,
典型_有G T1 D1->
典型_有G T2 D2->
D1&&D2==D3->
典型_具有G(典型_和T1 T2)D3
|typ_or_has:对于所有G T1 T2 D1 D2 D3,
典型_有G T1 D1->
典型_有G T2 D2->
D1 | | D2==D3->
典型_具有G(典型_或T1 T2)D3
具有
类型_相:ctx->类型->标签->
道具
:=
|typ_top_hasnt:对于所有G l,
典型_相G典型_顶部l
(*
|typ_bot_hasnt:没有一个标签是typ_bat没有的。
*)
|typ_rcd_ hasnt:对于所有G D l,
l<>标签_of_dec D->
典型_相G(典型_ rcd D)l
|typ_sel_hasnt:对于所有G x T L Lo-Hi L,
绑定x T G->
典型_has G T(dec_typ L Lo-Hi)->
典型_hasnt G高l->
典型_相G(典型_选择(avar_f x)L)L
|typ_and_hasnt:对于所有G T1 T2 l,
典型_相G T1 l->
典型_相G T2 l->
典型_相G(典型_和T1 T2)l
(*
也可以只有两个typor或hasnt规则,它们只探索1个类型,但对于
证明,最好总是探索这两种类型
*)
|typ_or_hasnt_1:对于所有G T1 T2 D,
典型相位G T1(标记D)->
典型_具有G T2 D->
典型_相G(典型_或T1 T2)(标签_of_dec D)
|typ_or_hasnt_2:对于所有G T1 T2 D,
典型_有G T1 D->
典型相G T2(标签_of_dec D)->
典型_相G(典型_或T1 T2)(标签_of_dec D)
|typ_or_hasnt_12:对于所有G T1 T2 l,
典型_相G T1 l->
典型_相G T2 l->
典型_相G(典型_或T1 T2)l。
(*
[stable_typ T]表示T的成员在变窄下不会改变。
TODO这可以扩展为包括“类类型”和稳定类型的别名。
*)
感应式
稳定类型:典型->
道具
:=
|stable_top:stable_typ类型top
|稳定点:稳定类型类型点
|stable_rcd:对于所有D,stable_typ(typ_rcd D)
(*
注:typ_sel不稳定(这就是全部)
*)
|stable_and:对于所有T1 T2,stable_typ T1->stable_typ T2->stable _typ(典型值和T1 T2)
|stable_or:对于所有T1 T2,stable_typ T1->stable_typ T2->stabile_typ(typ_或T1 T2)。
(*
wf的意思是“结构良好”,而不是“基础良好”;-)
G;
A|-T wf G:上下文
A: 假设(假设为wf的一组类型)
T: 要检查的类型
让我们区分“计算型”和“非泛型”
正如朱利安·克雷丁在论文中所做的那样:
计算类型是那些在术语级具有相应构造函数的类型,
即仅typ_rcd。
非扩展类型是指那些只是“别名”的类型[广义上;-)],
即路径类型和/或类型的边界。
因为我们只想允许保护递归,所以只需要计算类型的规则
将要检查的类型添加到假设中(即仅wfrcd)。
*)
感应式
wf_typ_impl:ctx->fset类型->类型->
道具
:=
|wf_top:对于所有G A,
wf_typ_impl G A典型顶部
|wf_bot:对于所有G A,
wf_typ_impl G A典型bot
|wf_hyp:对于所有G A T,
T型\
在里面
A->
wf_typ_impl通用
|wf_rcd:对于所有G A D,
wf_dec_impl G(A\u\{(典型_rcd D)})D->
wf_typ_impl G A(典型值_rcd D)
|wf_sel:对于所有G A x x L T U,
绑定x x G->
稳定类型X->
(*
<--重要限制
*)
典型值_has G X(dec_typ L T U)->
wf_typ_impl G A X->
wf _ typ _ impl G A T->
wf_typ_impl G A U->
wf_typ_impl G A(典型值_选择(avar_f x)L)
|wf_and:对于所有G A T1 T2,
wf_typ_impl G A T1->
wf_typ_impl G A T2->
wf_typ_impl G A(典型值和T1 T2)
|wf_or:对于所有G A T1 T2,
wf_typ_impl G A T1->
wf_typ_impl G A T2->
wf_typ_impl G A(典型值或T1 T2)
具有
wf_dec_impl:ctx->fset类型->dec->
道具
:=
|wf_tmem:对于所有G A L Lo-Hi,
wf_typ_impl G A低->
wf_typ_impl G A你好->
wf_dec_impl G A(dec_typ L低-高)
|wf_mtd:对于所有G A m U V,
wf_typ_impl G A U->
wf_typ_impl G A V->
wf _ dec _ impl G A(U V的dec _ mtd m)。
符号
wf_typ G T:=(wf_typ_impl G \{}T)。
符号
wf_dec G D:=(wf_dec_impl G\{}D)。
(*
subtypselr是否检查边界
*)
感应式
cbmode:Set:=checked|nocheck。
感应式
子类型:cbmode->ctx->typ->typ->
道具
:=
|subtyp_refl:对于所有hm G T,
wf类型G T->
子类型hm G T T
|subtyp_top:对于所有hm G T,
wf类型G T->
子类型hm G T类型_top
|subtyp_bot:对于所有hm G T,
wf类型G T->
子类型hm G typ_bot T
|subtyp_rcd:对于所有hm G D1 D2,
亚dec hm G D1 D2->
子类型hm G(typ_rcd D1)(typ_rcd D2)
|subtyp_sel_l:对于所有hm G x x l T U,
绑定x x G->
wf_typ G(典型_选择(avar_f x)L)->
典型值_has G X(dec_typ L T U)->
子类型hm G(typ_sel(avar_f x)L)U
|subtype_sel_r_checked:对于所有G x x L T U,
结合x x G->
wf_typ G(典型_选择(avar_f x)L)->
典型值_has G X(dec_typ L T U)->
检查的子类型G T U->
(*
<--在subtyp_to_memberwise中需要
*)
检查的子类型G T(typ_sel(avar_f x)L)
|subtyp_sel_r_nocheck:对于所有G x x L T U,
绑定x x G->
wf_typ G(典型_选择(avar_f x)L)->
典型值_has G X(dec_typ L T U)->
子类型nocheck G T(typ_sel(avar_f x)L)
|subtyp_and:对于所有hm G T U1 U2,
子类型hm G T U1->
子类型hm G T U2->
子类型hm G T(典型_和U1 U2)
|subtyp_and_l:对于所有hm G T1 T2,
wf类型G T1->
wf类型G T2->
子类型hm G(典型和T1 T2)T1
|subtyp_and_r:对于所有hm G T1 T2,
wf类型G T1->
wf类型G T2->
子类型hm G(典型和T1 T2)T2
|subtyp_or:对于所有hm G T1 T2 U,
子类型hm G T1 U->
子类型hm G T2 U->
子类型hm G(典型或T1 T2)U
|subtyp_or_l:对于所有hm G T1 T2,
wf类型G T1->
wf类型G T2->
亚型hm G T1(典型T1或T2)
|subtyp_or_r:对于所有hm G T1 T2,
wf类型G T1->
wf类型G T2->
子类型hm G T2(典型或T1 T2)
|subtyp_trans:对于所有hm G T1 T2 T3,
子类型hm G T1 T2->
亚型hm G T2 T3->
亚型hm G T1 T3
具有
subdec:cbmode->ctx->dec->dec->
道具
:=
|subdec_typ:对于所有hm G L Lo1 Hi1 Lo2 Hi2,
子类型hm G Lo2 Lo1->
子类型hm G Hi1 Hi2->
亚十进制hm G(十进制L Lo1 Hi1)(十进制LLo2 Hi2)
|subdec_mtd:对于所有hm m G S1 T1 S2 T2,
子类型hm G S2 S1->
子类型hm G T1 T2->
亚十进制hm G(十进制mS1 T1)(十进制m S2 T2)。
(*
在术语级别键入总是不精确的(可以使用包含)
*)
感应式
类型:ctx->trm->类型->
道具
:=
|ty_var:对于所有G x T,
绑定x T G->
wf类型G T->
典型_ trm G(trm_var(avar_f x))T
|ty_call:对于所有G t t m U V U,
ty_trm G t t->类型
典型_具有G T(dec_mtd m U V)->
类型_ trm G u u->
(*
<--允许包含
*)
wf类型G V->
ty_trm G(trm_call t m u)伏
|ty_new:对于所有L G ds T u u,
(
对于所有人
x、 x\notin L->
ty_defs(G&x~(open_typ x T))(打开_defs x ds)(打开类型x T)->
(
对于所有人
x、 x\notin L->
ty_trm(G&x~(open_typ x T))(open_trm x u)u)->
工作流类型G U->
(*
<--甚至强于fv_typ U中的x\notin
*)
ty_trm G(trm_new ds u)u
(*
不精确的类型:允许包含
*)
|ty_sbsm:对于所有G t T1 T2,
ty_trm G t T1->
子类型nocheck G T1 T2->
类型_trm G t T2
具有
ty_def:ctx->def->dec->
道具
:=
|ty_tdef:对于所有G L T,
wf类型G T->
ty_def G(定义类型L T)(定义类型T T)
|ty_mdef:对于所有L m G T U U,
(*
这些wf检查确保x不会出现在T和U中。
但请注意,它可以出现在u的精确类型中。
*)
wf类型G T->
wf类型G U->
(
对于所有人
x、 x\notin L->
ty_trm(G&x~T)(open_trm x u)u)->
(*
<--允许包含
*)
典型_ def G(定义_ mtd m T U U)(定义_ dtd m T U)
具有
类型定义:ctx->定义->类型->
道具
:=
|ty_defs_nil:对于所有G,
ty_defs G defs_nil typ_top类型_顶部
|ty_defs_cons:对于所有G ds d T d,
典型_ defs G ds T->
典型_ def G d d->
defs_hasnt ds(标签of_def d)->
(*
<--无重复项
*)
ty_defs G(defs_cons ds d)(typ_和T(typ_rcd d))。
(*
****形状良好的仓库
*)
感应式
wf_sto:sto->ctx->
道具
:=
|wf_sto_empty:wf_sto空
|wf_sto_push:对于所有s G x ds T,
wf至s G->
x#s->
x#G->
(*
注意,ds和T已经用x打开。
*)
ty_defs(G&x~T)ds T->
wf_sto(s&x~ds)(G&x~T)。
(*
######################################################################
*)
(*
***我们想要证明的声明
*)
定义
进展:=对于所有G e T,
wf_到s G->
类型_终端G e T->
(
(*
可以步进
*)
(存在e’s’,红色e’s‘)\/
(*
或是一个值
*)
(存在x o,e=(trm_var(avar_f x))/\绑定x o)
).
定义
保存:=对于所有的G e T e’s,
wf_sto s G->ty_trm G e T->红色e s e’s’->
(存在G',wf_sto s'(G&G')/\ty_trm(G&G')e'T)。
(*
######################################################################
*)
(*
######################################################################
*)
(*
**基础设施
*)
(*
######################################################################
*)
(*
***归纳原则
*)
方案
typ_mut:=感应
对于
典型排序
道具
具有
dec_mut:=dec分拣属性的归纳。
组合
方案
来自typ_mut、dec_mut的typ_mutind。
方案
trm_mut:=感应
对于
trm排序
道具
具有
def_mut:=感应
对于
定义排序
道具
具有
defs_mut:=定义排序属性的归纳。
组合
方案
来自trm_mut、def_mut和defs_mut的trm_mutind。
方案
typ_has_mut:=感应
对于
typ_has排序
道具
具有
typ_hasnt_mut:=typ_hasnt排序属性的归纳。
组合
方案
从typ_has_mut、typ_hant_mut中选择typ_his_munt。
方案
wf_typ_mut:=感应
对于
wf_typ_impl排序
道具
具有
wf_dec_mut:=wf_dec_impl排序属性归纳。
组合
方案
wf_mutin来自wf_typ_mut,wf_dec_mut。
方案
subtype_mut:=诱导
对于
子类型排序
道具
具有
subdec_mut:=subdec排序属性的归纳。
组合
方案
subtyp_mut、subdec_mut中的subtyp_Muted。
方案
ty_trm_mut:=感应
对于
ty_trm排序
道具
具有
ty_def_mut:=感应
对于
ty_def排序
道具
具有
ty_defs_mut:=ty_defs排序属性归纳。
组合
方案
从ty_trm_mut、ty_def_mut和ty_defs_mut中选择ty_munt。
(*
######################################################################
*)
(*
***战术
*)
Ltac公司
gather_vars(_V):=
让
A:=集合变量(
乐趣
x:变量=>x)
在里面
让
B:=集合变量(
乐趣
x:var=>\{x})
在里面
让
C:=gather_vars_with(带)(
乐趣
x:ctx=>(dom x)\u(fv_ctx类型x))
在里面
让
D:=集合变量(
乐趣
x:sto=>dom x)
在里面
让
E:=集合变量(
乐趣
x:avar=>fv_avar x)
在里面
让
F:=集合变量(
乐趣
x:trm=>fv_trm x)
在里面
让
G:=集合变量(
乐趣
x:定义=>fv_def x)
在里面
让
H:=与(
乐趣
x:定义=>fv_defs x)
在里面
让
I:=gather_vars_with(
乐趣
x:典型值=>fv_typ x)
在里面
施工
:(A\u B\u C\u D\u E\u F\u G\u H\u I)。
Ltac公司
拾取刷新x(_F):=
让
L:=gather_vars in(pick_fresh_gen L x)。
Ltac公司
空矛盾(_E):=
解决[
比赛
目标
具有
|H:_\
在里面
\{}|-_=>重写in_empty
在里面
H;
exfalso;
精确H
结束
].
Ltac公司
eq_专用:=
重复
比赛
目标
具有
|H:_=_->_|-_=>专业化(H eq_refl)
|H:对于所有_,_=_->_|-_=>专业化(H _ eq_refl)
|H:对于所有_ _,_=_->_ |-_=>专业化(H _ _ eq_refl)
|H:对于所有_ _,_=_->_ |-_=>专业化(H _ _ eq_refl)
|H:对于所有_ _ _,_=_->_ |-_=>专业化(H _ _ _ eq_refl)
结束
.
Ltac公司
压碎:=eq_specialize;
eauto公司。
战术
符号
“应用_刷新”
施工
(T) “”
作为
“识别码(x):=
apply_fresh_base T集合变量x。
提示
建造师
stable_typ(稳定类型)
类型_具有类型_相位
wf类型impl wf _ dec _ impl
亚dec亚型
ty_trm ty_def类型定义。
提示
建造师
wf至。
引理
fresh_push_eq_inv:针对所有A x A(E:env A),
x#(E&x~a)->错误。
证明
.
介绍。
重写H.中的dom_push false H.重写in_union。
左侧。
重写in_singleton。
自反性。
Qed(问题)
.
(*
****示例策略
*)
Ltac公司
打开(_O):=
重复
比赛
目标
具有
|_:_|-context[open_avar__]=>展开open_avar;
简单
|_:_|-context[open_typ__]=>展开open_typ;
简单
|_:_|-context[open_dec__]=>展开open_dec;
简单
|_:_|-context[open_trm__]=>展开open_trm;
简单
|_:_|-context[open_def__]=>展开open_def;
简单
|_:_|-context[open_defs__]=>展开open_defs;
简单
|_:_|-上下文[(
如果
_ = _
然后
_
其他的
_)]=>案例_if;
简单
结束
.
Ltac公司
prove_defs_hasnt:=解决[
重复
比赛
目标
具有
|_:_|-defs_hasnt__=>展开defs_hatn;
简单;
汽车
|_:_|-上下文[(
如果
_ = _
然后
_
其他的
_)]=>案例_if;
简单;
汽车
结束
].
Ltac公司
split_ty_defs(拆分_定义):=
重复(prove_defs_hasnt |应用ty_defs_cons |应用ty-defs_nil)。
Ltac公司
prove_binds:=解决[
展开绑定;
重写EnvOps.get_def;
展开get_impl;
repeat(重写<-constto_push |caseif);
自动]。
Ltac公司
证明_in_fset:=解决[
在union中重复重写;
在singleton中重复重写;
自动10]。
(*
######################################################################
*)
(*
***示例
*)
(*
val glob=新{
E: 顶部。。
顶部,
流:Bot..{head:Top->glob.E}/\{tail:Top->glob.Stream}
};
val单元=新{};
val-stream=新{head(x:Top):glob.E=单元,tail(x:Top):glop.stream=流};
流.尾(单元).尾(单位).头(单位)
*)
模块
示例1。
参数
E: 典型标签。
参数
流:typ_label。
公理
E_ne_Stream:E流。
参数
头部:mtd_lable。
参数
尾部:mtd_lable。
公理
head_e_tail:头部<>尾部。
定义
示例1:trm:=
trm_new(defs_cons(defs_cons defs_nil
(定义类型E类型_顶部)
(定义类型流(类型和
(典型_ rcd(dec _ mtd头部典型_顶部(典型_ sel(avar_b 0)E))
(typ_rcd(dec_mtd尾部typ_top(typ_sel(avar_b 0)流)))
)
(trm_new-defs_nil
(trm_var(avar_b 0)))。
事实
tc1:ty_trm空ex1 typ_top。
证明
.
assert(ne1:label_typ E<>label_typ流)。
{
介绍。
倒置H应用E_ne_Stream。
假设。
}
断言(ne2:label_mtd头<>label_mitd尾)。
{
简介。
反转H应用head_e_tail。
假设。
}
展开ex1。
eapply ty_new with \{}(typ and(typ和typ_top
(类型_ rcd(dec_typ E类型_顶部类型_顶部))
(typ_rcd(dec_typ流
(类型_和
(典型_ rcd(dec _ mtd头部典型_顶部(典型_ sel(avar_b 0)E))
(typ_rcd(dec_mtd尾部typ_top(typ_sel(avar_b 0)流))
(类型_和
(典型_ rcd(dec _ mtd头部典型_顶部(典型_ sel(avar_b 0)E))
(typ_rcd(dec_mtd尾部typ_top(typ_sel(avar_b 0)流))))。
{介绍glob_.do_open。
记住(typ和
(typ_rcd(dec_mtd头部typ_top(typ_sel(avar_f glob)E))
(typ_rcd(dec_mtd尾部typ_top(typ_sel(avar_f glob)流))
作为TStream eqn:EqTStream。
split_ty_defs。
{自动}
{应用ty_tdef。
在*中重写concat_empty_l。
在3重写EqTStream。
应用wf_and。
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{埃托。}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.profe_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{埃托。}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.profe_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
}
}
{自动}
{应用wf_top。}
}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在5重写EqTStream。
应用wf_and。
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复应用wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top_))。
eapply(wf_sel((binds_single_eq_)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复应用wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.profe_in_fset。}
}
{在9处重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
}
}
{应用wf_top。}
{应用wf_top。}
}
{应用wf_hyp.prove_in_fset。}
}
{在5重写EqTStream。
应用wf_and。
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{埃托。}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.profe_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在7处重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
}
}
}
{应用wf_top。}
{应用wf_top。}
}
{应用wf_hyp.prove_in_fset。}
}
}
}
{在3重写EqTStream。
应用wf_and。
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在5重写EqTStream。
应用wf_and。
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在7重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_rcd.apply(wf_mtd_(wf_top))。
eapply(wf_sel((binds_single_eq_)))。
{自动}
{自动}
{重复apply wf_and。
{应用wf_top。}
{自动}
{应用wf_rcd。应用wf_tmem。
{在9处重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
{在9重写EqTStream。
应用wf_and。
{应用wf_hyp.prove_in_fset。}
{应用wf_hyp.prove_in_fset。}
}
}
在原始视图中查看文件的其余部分
此时无法执行该操作。