File: namespace.tex

package info (click to toggle)
cafeobj 1.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid
  • size: 19,900 kB
  • sloc: lisp: 85,055; sh: 659; makefile: 437; perl: 147
file content (1032 lines) | stat: -rw-r--r-- 43,436 bytes parent folder | download | duplicates (2)
1
2
3
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
%
% Name Spaces of CafeOBJ
%
\documentclass[a4paper,oneside,10pt]{memoir}
\usepackage[hscale=0.76,vscale=0.76]{geometry}
\setlength{\parindent}{0.0cm}
\setlength{\parskip}{1.4ex}
\usepackage{graphicx}
\usepackage{proof}
\usepackage{fancyvrb}
%%% Japanese
%\usepackage{fontspec,xltxtra,xunicode}
%\usepackage{luatexja}
\usepackage{fontspec}
\usepackage{indentfirst}
\setmainfont[Mapping=tex-text]{M+ 2p}
\setsansfont[Mapping=tex-text]{M+ 2c}
\setmonofont[Mapping=tex-text]{M+ 2m medium}
\XeTeXlinebreaklocale "ja"
\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em
\XeTeXlinebreakpenalty=0
\renewcommand{\baselinestretch}{1.4}
\settowidth{\parindent}{あ}
%%%%
\usepackage{dcolumn,hhline,colortbl}
\usepackage[table]{xcolor}
\usepackage{tikz}
\usetikzlibrary{shadows.blur,shapes,positioning,arrows.meta,arrows,decorations,calc}
%%%%% 色付表
\newcolumntype{G}{%
  >{\columncolor[gray]{0.9}}c}
\newcolumntype{O}{%
  >{\columncolor{orange}}c}
\newcolumntype{M}{%
  >{\columncolor{green}}c}
\newcolumntype{Y}{%
  >{\columncolor{yellow}}c}
\newcolumntype{C}{%
  >{\columncolor{cyan}}c}
%%%% hyperref
%\usepackage[dvipdfm,colorlinks=true,linkcolor=blue]{hyperref} 
\usepackage[colorlinks=true,linkcolor=blue]{hyperref} 
%%%%%%%%%%syntax
\makeatletter
% terminal - used for terminal symbols, argument is characters appear in sf.
\def\sym#1{\textsf{#1}\null}
% nonterm - used for non terminal symbols, argument is characters typed with
%           italic face.
\def\nonterm#1{\textit{#1}\null}
%%%%%
% syntax ... endsyntax
\def\xstrut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
\def\syntax{\syntaxoutnonbox\halign\bgroup
    \xstrut$\@lign##$\hfil &\hfil$\@lign{}##{}$\hfil
    &$\@lign##$\hfil &\qquad\@lign-- ##\hfil\cr}
\def\endsyntax{\crcr\egroup$$
  \global\@ignoretrue
}
\def\syntaxoutnonbox{\xleavevmode$$
    \parskip=0pt\lineskip=0pt
    \def\\{\crcr}% Must have \def and not \let for nested alignments.
    \everycr={\noalign{\penalty10000}}
    \tabskip=0pt}
\def\xleavevmode{\ifvmode\if@inlabel\indent\else\if@noskipsec\indent\else
    \if@nobreak\global\@nobreakfalse\everypar={}\fi
    {\parskip=0pt\noindent}\fi\fi\fi}
\def\@but{\noalign{\nointerlineskip}}
\def\alt{{\;|\;}}
\def\seqof#1{\mbox{\textbf{\{}}\;{#1}\;\mbox{\textbf{\}}}}
\def\optn#1{\textbf{[}\;{#1}\;\textbf{]}}
\def\synindent{\;\;\;}
\makeatother
%%%
%%%% numbering
%%% ToC down to susubsections
\settocdepth{subsubsection}
%%% Numbering down to sections
\setsecnumdepth{subsection}
%%% 名前定義を適当に
\def\figurename{{図}}
\def\tablename{表}
\def\contentsname{目次}
\def\listfigurename{図目次}
\def\listtablename{表目次}
\def\refname{参考文献}
\def\bibname{参考文献}
\def\indexname{索引}
\def\appendixname{付録}
%%%%%%%%%% Verbatim
\DefineVerbatimEnvironment%
{simplev}{Verbatim}
{fontsize=\small}
\DefineVerbatimEnvironment%
{examplev}{Verbatim}
{frame=leftline,fontsize=\small}
%%%%%%%%%%
\definecolor{shadecolor}{gray}{0.9}
\newenvironment{vvtm}%
{\parskip=0pt\lineskip=0pt\begin{center}\begin{minipage}{0.8\textwidth}\begin{snugshade}}%
  {\end{snugshade}\end{minipage}\end{center}}
%%%
\usepackage{float}
\begin{document}
\headstyles{default}
\tightlists
%\midsloppy
\sloppy
\raggedbottom
\chapterstyle{ell}
%%%%%%%%
\frontmatter
\pagestyle{empty}
% 表紙 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{\textbf{CafeOBJ言語システムの名前空間}}
\author{澤田 寿実\\
  (株) 考作舎\\
  toshi.swd@gmail.com}
\date{}
\maketitle
 
\thispagestyle{empty}
\newpage
%%%%%%
\mainmatter
\pagestyle{plain}
\pagenumbering{arabic}
% 構成 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tableofcontents
\newpage
\chapter{CafeOBJ言語の名前空間と名前表示コマンド}
\label{chap:name-space}
CafeOBJ言語における「名前」,すなわち利用者が特定のオブジェクト\footnote{
本書ではCafeOBJ言語の利用者にとって中核をなすモノ(概念要素)をオブジェクトと呼ぶ.
厳密にはCaefOBJの形式的な構文定義に出現する各構文要素に対応してオブジェクトが%
存在し得るが,利用者が形式仕様を記述する上で理解しておくべき話とは無縁である.
知らなければならないのは,モジュール,オペレータ,ソート,公理,変数,パラメータ,%
それとモジュール式の解釈(それと--あれば--それらの属性)である.
従って本書ではこれのみを「オブジェクト」として参照する.
オブジェクトの中には「名前」によって参照出来ないものもある.}
を名付け,および参照するために使える文字列の構文規則について述べる.

続いて,モジュールの名前空間の表示コマンド,
および特定の名前を持ったオブジェクトの表示コマンドについて説明する.

\section{CafeOBJ言語の名前空間種別}
\label{sec:cafeobj-name-spaces}
本章ではCafeOBJ言語システムの名前空間の構造について調べる.
名前自身の構文については別途章を改める.

CafeOBJ言語の名前空間には次の2種がある:
\begin{enumerate}
\item トップレベル\\
  モジュール宣言とview宣言で導入された,それぞれモジュールおよびviewの名前の集合からなる.
\item モジュール\\
  ある特定のモジュールの中で参照可能な名前の集合であり,これは以下のものからなる:
  \begin{itemize}
    \item そのモジュールで宣言された以下のオブジェクトの名前:
      \begin{enumerate}
      \item パラメータの名前
      \item サブモジュールの名前
      \item ソートの名前
      \item オペレータの名前
      \item 変数の名前
      \item 公理ラベルの名前
      \end{enumerate}
    \item 輸入しているモジュールの名前空間に含まれる名前のうち,変数名を除いた名前
    \item トップレベルの名前空間に含まれる名前
  \end{itemize}
\end{enumerate}

以下これらの名前空間の構造について詳細を述べる.

\subsection{トップレベルの名前空間の構造と参照の解決}
\label{sec:toplevel-name-space}
上で述べた通りトップレベルの名前空間はモジュールの名前とviewの名前からなり,
これらは重なりを持つことがあり得る(図~\ref{fig:toplevel}を参照).

\begin{figure}[H]
\begin{center}
  \input toplevel.tikz
  %\includegraphics[scale=0.7]{toplevel.pdf}
\caption{トップレベルの名前空間}
\label{fig:toplevel}
\end{center}
\end{figure}

すなわち,同一の名前を持つモジュールとviewを宣言する事が可能である.
この場合モジュール式(第~\ref{sec:modexpr}章を参照)によっては
そこに出現する名前がモジュールの名前かviewの名前かで曖昧性が生ずる場合があり得るが,
本書が対象としているCafeOBJインタプリタでは以下のようにして曖昧さを回避する:
\begin{enumerate}
\item 指定の名前を持つviewを探す
\item その名前のviewが宣言されていれば,そのviewが指定されているものと解釈する
\item さもなければモジュールの名前が指定されているものと解釈する
\end{enumerate}

\subsection{モジュールの名前空間の構造と参照の解決}
\label{sec:inner-module-namaspece}

\subsubsection{サブモジュールを持たないモジュールの名前空間}
\label{sec:flat-module}

まず,輸入しているモジュール(サブモジュール)を持たないモジュールの名前空間の構造を%
図~\ref{fig:flat-module-namespece}に示す:
\begin{figure}[H]
\begin{center}
  \input flat-module.tikz
  %\includegraphics[scale=0.7]{flat-module.pdf}
\caption{サブモジュールなしのモジュールの名前空間}
\label{fig:flat-module-namespece}
\end{center}
\end{figure}
図から了解されるように,ソート,オペレータ,変数,公理それぞれで%
互いに同名のものが許される.
通常は名前の出現する文脈(構文)に応じてどの種のオブジェクトについての%
名前であるかが明確となるため曖昧性が生ずることは無い.
唯一あり得るのは,定数オペレータと変数の名前が同じ場合である.

\subsubsection{同名の定数項と変数の参照の解決}
まず,他のオペレータの引数に出現している場合 ``$f(N)$''を考える.
ここで名前 $N$ が定数オペレータ及び変数の名前として宣言されているとする.
システムは次のようにして項$f(N)$の解釈を試みる:
\begin{enumerate}
\item オペレータ$f$の引数のソートを調べる.たまたまこれが$S$であったとする.
\item $N$ という名前でかつソートが$S$以下の定数オペレータを探す.
\item これが見つかった場合$N$は定数オペレータの項であると解釈する.
\item 定数オペレータが見つからなかった場合は,$N$ という名前でソート$S$以下の変数を探す.
\item このような変数が見つかれば $N$ は変数項であると解釈する.
\item 上のいずれでもない場合は構文エラーとする.
\end{enumerate}
これで分かる通り,システムは項が出現する文脈に応じて期待されるソートにより%
制約をかけ,なおかつオペレータの名前の方を優先して解釈しようとする.
同名の変数と定数オペレータが互いに関係の無いソートのものであれば%
引数に出現する限りにおいて,曖昧性が生ずることは無い.

次に項 $N$ が単独で出現した場合であるが,これは解釈のための文脈がないため%
曖昧さを解消する術がない.
従ってこの場合は,項が曖昧であるとした構文エラーとして扱われる.

\subsubsection{階層的モジュールの名前空間の構造}
\label{sec:hierachical-module}
あるモジュールが他のモジュールを輸入している時,輸入されているモジュールを%
サブモジュールと呼ぶ.この時サブモジュールの名前空間に含まれる名前は,
\textbf{変数の名前を除いて}\footnote{
すなわち,輸入しているモジュールで宣言されている変数を参照することは出来ない.}
輸入しているモジュールの名前空間の一部となる(図~\ref{fig:hir-module}を参照).
図ではモジュールAがモジュールBを,モジュールBが%
モジュールCを輸入している場合が図示されている\footnote{一般にモジュールの輸入関係は%
有向グラフ構造となるが,ここでの議論に関して違いは無い.}.
\begin{figure}[!ht]
\begin{center}
  \input hir-module-namespace.tikz
  %\includegraphics[scale=0.7]{hir-module-namespace.pdf}
  \caption{階層的モジュールの名前空間}
  \label{fig:hir-module}
\end{center}
\end{figure}

輸入されるサブモジュールはモジュール式と呼ばれる構文で指定される.
モジュールの名前はモジュール式の構成要素である.
モジュール式にはまた,viewの名前が含まれることがある\footnote{
モジュール式にはそこに含まれるモジュールの名前で参照されるモジュールの%
名前空間に含まれるソートやオペレータの名前も含む事が出来るが,
モジュール式の中で閉じたものであるため,ここではその詳細に触れない.}.
また,パラメータ付きモジュールのパラメータ宣言部にもモジュール式が出現する.
つまり,トップレベルの名前空間はモジュール宣言構文の一部(パラメータ宣言部及び%
モジュール輸入)において可視である.図にはその事も示されている.

\subsubsection{パラメータ}
パラメータもモジュール輸入の一形態と考えることが出来る\footnote{少なくとも%
名前空間と名前による参照を議論する場合,そのような解釈で問題ない.}.
すなわち,パラメータ $C :: M$ があった場合\footnote{$C$ はパラメータの名前,
$M$ はパラメータの仕様を規定するモジュール式.},
モジュール$M$の名前空間にある名前は,やはり(変数を除いて)%
そのパラメータを持つモジュールの名前空間の一部となる.
この場合,あたかも$C$という名前のモジュールが輸入されていると見なすことが出来る.

\subsubsection{文脈限定名による参照の曖昧性の解決}
\label{sec:qualified-name}
あるモジュール$A$がサブモジュールをもつ場合,
ある名前$\alpha$の参照が曖昧となる事があり得る.
\begin{figure}
\begin{center}
\input disunbig.tikz
%\includegraphics[scale=0.7]{disunbig.pdf}
\end{center}
\caption{名前の衝突と文脈限定名による解決}
\label{fig:disunbig}
\end{figure}
これらが互いに異なったオブジェクトの名前であれば特に問題は無い(変数と定数%
オペレータの名前の衝突については第~\ref{sec:flat-module}を参照).
しかし,例えば$\alpha$という名前が全てソートの名前だった場合,
構文上同じ文脈に登場することとなるため,%
どれを指し示すのかが曖昧である(図~\ref{fig:disunbig}を参照).
しかし名前の参照を解決する名前空間を制限すると,曖昧性が解消出来る.
例えば,図~\ref{fig:disunbig}のモジュールEの名前空間にある$\alpha$は,
モジュールDの名前空間では曖昧性が無い.
このような名前空間の制限に対する制限を指定する構文がCafeOBJにはあり,%
\textbf{文脈限定名}と呼ぶ.名前空間の指定にはモジュールの名前を用いる.
例えば名前$\alpha$についての文脈限定名は $\alpha.M$ の形式で表記され,$M$%
がモジュールの名前であり,\textbf{モジュール限定子}と呼ぶ.
名前$M$で示されるモジュールの名前空間で$\alpha$を解釈せよ,という意味となる.

文脈限定名$\alpha.M$ の$M$は,必ずしも参照対象とするオブジェクトの名前$\alpha$が%
導入されたモジュールの名前で無くとも良いことに注意されたい.
前述のように,サブモジュールの名前空間は(変数の名前を除き)輸入元の名前空間に
取り込まれるため,名前$\alpha$の参照について曖昧さが生じないような文脈でありさえすれば良い.

\subsubsection{文脈限定名が使える名前}
\label{sec:available-qualified-name}

全てのオブジェクトの名前について文脈限定名が使用出来るわけではなく,
使用可能なのは以下3つのオブジェクトのみである:
\begin{table}[htb]
\begin{vvtm}
\begin{center}
\begin{tabular}{l}
ソート \\
定数オペレータ \\
公理ラベル \\
\end{tabular}
\end{center}
\end{vvtm}
\caption{文脈限定名が使用可能なオブジェクト}
\label{tbl:qulifiable-names}
\end{table}

従ってこれら以外のオブジェクトで同名のものがある場合,曖昧性を解消する手段が無い.
そのような場合はモジュール式を用いて名前の付け替えを行い,
曖昧性を回避しなければならない.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{CafeOBJ言語の構文と名前}
\label{sec:cafeobj-syntax-and-names}
前章ではCafeOBJの名前空間について,CafeOBJの構文とは切り離して全体的な構造を調べた.
本章ではCafeOBJの言語の構文に基づいて,そこに出現する各種の「名前」について洗い出し,
構文上どこにどのような種類の「名前」が存在するかを確認する.

\subsection{構文表記法}
\label{sec:syntax-notation}
以下でCafeOBJの具体的な構文定義を参照するが,そこで使用される
表中構文は拡張BNF文法で定義されている.
生成規則の形式は次の通り:
\begin{syntax}
\synindent\synindent  nonterminal &::=& alternative \alt alternative \alt \cdots \alt alternative
\end{syntax}
これは,$nonterminal$ という構文要素は,$\alt$ で区切られた
それぞれの $alternative$ のどれかである事を意味する.

非終端シンボルは \textit{italic face} で,終端記号は
``\sym{terminal}'' のような字体で表記する.
また終端記号は `` と '' で囲み,拡張BNF文法で使用される
メタ文字と区別できるようにする事がある.
BNFの拡張形式は以下の通りである:
\begin{center}
\begin{minipage}{0.7\textwidth}
  \begin{tabular}{ll}
    a $\cdots$ & 1つ以上の a. \\
    a, $\cdots$ & カンマ記号で区分された一つ以上の\textit{a} のリスト: \\
    & ``a'' or ``a, a'' or ``a, a, a'', etc. \\
    $\seqof{\textrm{a}}$ & \textbf{\{} と \textbf{\}} はメタな構文括弧であり,これで囲まれた\\
    & \textit{a} はひとまとまりの構文カテゴリとして扱われる. \\
    $\optn{\textrm{a}}$ & \textit{a} はあっても無くとも良い: ``'' または ``a''.
  \end{tabular}
\end{minipage}
\end{center}
%%%%% 
\subsection{モジュール宣言の構文と名前}
\label{sec:module-decl}
以下にCafeOBJ言語のモジュール宣言の構文のうち「名前」に関係する部分について%
抜粋したものを示す.構文中 ``(1)'' のように先頭に番号が振っている構文規則が%
名前を含んでいるものである.
\begin{syntax}
(1)\  module &::=& module\_type\; module\_name \;
  \optn{parameters} \;
  \optn{principal\_sort} \\
  && \sym{``\{''}\; module\_elt\cdots \; \sym{``\}''} \\
  \synindent module\_type &::=& \sym{module} \alt \sym{module!} \alt
  \sym{module*}\\ 
  \synindent (2) module\_name &::=& ident \\
  parameters &::=& \sym{``(''}\; parameter, \cdots \sym{``)''}\\
  \synindent (3)\ parameter &::=&
  \optn{\sym{protecting}\alt\sym{extending}\alt\sym{including}}\; 
  paramter\_name \; 
  \sym{::}\; module\_expr \\
  \synindent (4)\ parameter\_name &::=& ident \\
  (5)\ principal\_sort &::=& \sym{principal-sort}\; sort\_name \\
  module\_elt &::=& import \alt sort  \alt operator \alt
  variable \alt axiom \alt macro \alt comment \\
  import &::=& \seqof{\sym{protecting}\alt\sym{extending}\alt\sym{including}\alt\sym{using}}
  \sym{``(''}\;module\_expr\;\sym{``)''}\\
  sort & ::= & visible\_sort \alt hidden\_sort \\
  \synindent visible\_sort & ::=& \sym{``[''}\; sort\_decl, \cdots \; \sym{``]''} \\
  \synindent hidden\_sort & ::=& \sym{``*[''}\; sort\_decl, \cdots \; \sym{``]*''} \\
  \synindent (6)\ sort\_decl &::=& sort\_name\; \cdots\; \optn{supersorts\; \cdots} \\
  \synindent (7)\ supersorts &::=& <\; sort\_name\; \cdots \\
  \synindent sort\_name &::=& sort\_symbol\optn{qualifier} 
  \\ 
  \synindent (8)\ sort\_symbol &::=& ident \\
  \synindent (9)\ qualifier &::=& \sym{``.''}module\_name\\
  (9)\ operator &::=& \seqof{\sym{op}\alt\sym{bop}}
               \; operator\_symbol\; : \; \optn{arity}\; \verb|->|\;
  coarity \; \optn{op\_attrs} \\
  \synindent (10)\ arity &::=& sort\_name \cdots \\
  \synindent (11)\ coarity &::=& sort\_name \\
  \synindent op\_attrs &::=& \sym{``\{''}\;op\_attr\cdots\;\sym{``\}''} \\
  (12)\ variable &::=& \sym{var}\; var\_name\; :\; sort\_name \alt
  \sym{vars} \; var\_name\cdots\; :\; sort\_name \\
  (13)\ \synindent var\_name &::=& ident \\
  axiom &::=& equation \alt cequation\alt transition \alt ctransition \alt fol\\
  \synindent equation &::=& \seqof{\sym{eq} \alt \sym{beq}}\;
  \optn{label}\; term \; \sym{=} \; term\; \sym{``.''}\\
  \synindent cequation &::=& \seqof{\sym{ceq} \alt \sym{bceq}}\;
  \optn{label}\; term \; \sym{=} 
  \; term\; \sym{if}\; term\;\sym{``.''} \\
  \synindent transition &::=& \seqof{\sym{trans} \alt \sym{btrans}}\;
  \optn{label}\; term \; \verb|=>| \; term \;\sym{``.''}\\
  \synindent ctransition &::=& \seqof{\sym{ctrans} \alt \sym{bctrans}}\;
  \optn{label}\; term \; \verb|=>| \; term\; \sym{if}\; term\;\sym{``.''}\\
  \synindent fol & ::= & \sym{ax} \optn{label}\; term \; \sym{``.''}\\
  \synindent (14)\ label &::=& \sym{``[''}\; label\_name\cdots\; \sym{``]:''}\\
  \synindent (15)\ label\_name &::=& ident\optn{qualifier} \\
\end{syntax}

\subsubsection{モジュール宣言文に出現する名前の種別}
\label{sec:names}
第~\ref{sec:module-decl}節で示した構文はCafeOBJ言語のモジュール宣言文の構文である.
ここにはCafeOBJ言語における「名前」のほとんど全て(view の名前を除く,これについては%
後述する)が出現している.前述のとおり,ここで示した構文定義中で ``(N)''のように%
番号をつけた構文で「名前」が出現している.
これらを整理すると以下の通りとなる.
これらの名前を使用することにより,利用者は対応するオブジェクトを参照する.

\begin{center}
  \begin{tabular}{@{} clll @{}}
    \toprule
    非終端記号 & 名前種別 & 参照先 & 構文番号\\ 
    \midrule
    $module\_name$ & モジュール名 & モジュール & (1)\\ 
    $parameter\_name$ & パラメータ名 &パラメータモジュール&(3) \\ 
    $sort\_name$ & ソート名 & ソート&(5),(6),(7),(10),(11)\\ 
    $operator\_symbol$ & オペレータ名 & オペレータ &(9)\\ 
    $var\_name$ & 変数名 & 変数&(12)\\ 
    $label\_name$ & 公理ラベル & 公理&(15) \\ 
    \bottomrule
  \end{tabular}
\end{center}

上に示した名前種別のうち,\nonterm{operator\_symbol}(オペレータ名)を除く全ての名前は%
CafeOBJ 言語の字句定義において \nonterm{ident}(識別子) として許される文字列により定義される%
\footnote{構文番号(2), (4) (8), (13), (14)を参照}.
構文(9)の\nonterm{qulifier}は第~\ref{sec:qualified-name}章で説明した%
文脈限定名を構成するモジュール限定子である.
第~\ref{sec:available-qualified-name}章では定数オペレータについても%
文脈限定名を使用する事が出来ると説明があったが,%
上記の構文定義中には反映されていない.
オペレータ名(\nonterm{operator\_symbol}については,
識別子(\nonterm{ident})と合わせて第~\ref{sec:token}章で説明する.

\subsection{モジュール式に出現する名前と名前空間}
\label{sec:modexpr}
下はモジュール式(\nonterm{module\_expr}の構文である.
\begin{syntax}
  module\_expr &::=& module\_name \alt sum \alt rename \alt instantiation 
  \alt \sym{``(''} module\_expr \sym{``)''} \\
  sum &::=& module\_expr\; \seqof{+\;\; module\_expr} \cdots \\
  rename &::=& module\_expr\;\sym{*}\;\sym{``\{''} rename\_map,\cdots
               \sym{``\}''} \\ 
  (1). instantiation &::=& module\_expr\;\sym{``(''}\textbf{\{}\;ident 
  [ qualifier ]\; \verb|<=|\; aview\textbf{\}},\;\cdots\;\sym{``)''}
  \\ 
  rename\_map &::=& sort\_map \alt op\_map \\
  (2). sort\_map &::=& \seqof{\sym{sort} \alt \sym{hsort}}\; 
  sort\_name \; \verb|->|\; ident \\
  (3). op\_map &::=& \seqof{\sym{op} \alt \sym{bop}}\;
                op\_name\;\verb|->|\;operaotr\_symbol \\
  (4). op\_name &::=& operator\_symbol\alt 
  \sym{``(''}operator\_symbol\sym{``)''}qualifier\\
  (5). aview &::=& view\_name\alt module\_expr\\
  & \alt & 
  \sym{view to}\; module\_expr\;\sym{``\{''} view\_elt,\cdots \sym{``\}''} \\
  (6). view\_name &::=& ident \\
  view\_elt &::=& sort\_map \alt op\_view \alt variable \\
  op\_view &::=& op\_map \alt term\; \verb|->|\; term
\end{syntax}


\subsection{view 宣言に出現する名前と名前空間}
\label{sec:view-declaration}

\begin{syntax}
  view &::=& \sym{view}\; view\_name\; \sym{from}\; module\_expr\; \sym{to}
  \; module\_expr \\
  && \sym{``\{''}\; view\_elt, \cdots \; \sym{``\}''} \\
\end{syntax}


\section{字句区切り文字と識別子,オペレータ名}
\label{sec:token}
識別子とオペレータ名はともに,不可視な文字を含まない連続したASCII英数字の文字列(\textbf{字句})
から構成される.
CafeOBJ システムは入力文字列を読み込む際に字句の区切りとして空白文字,タブ,改行,改ページ文字を
区切り記号として認識する.このような文字を\textbf{字句区切り文字}と呼ぶ.
すなわち,入力文字列は字句区切り文字によって切断される.
空白文字,タブ,改行,改ページのような不可視な文字は入力の際にスキップされ,
単なる字句の区切り記号として扱われる.これらに加えて以下の7文字が
字句区切り文字として定義されており,これらの文字はそれ自身で一つの字句を構成するものとして
認識される:
\begin{vvtm}
\begin{simplev}
   1. (          -- left paren 
   2. )          -- right paren
   3. [          -- left square bracket 
   4. ]          -- right square bracket
   5. {          -- left brace
   6. }          -- right brace
   7. ,          -- comma
\end{simplev}
\end{vvtm}

\subsection{識別子}
字句区切り文字は入力文字列から字句を切り出す印となる文字であるという性質上,
ソート名やモジュール名等の識別子を構成する文字として用いることは出来ない
\footnote{システムはこれらの文字を単純に自己自身で字句を構成する文字として読み込む.
そのため,文脈によってはエラーとならず,識別子を構成する文字として受け入れているように

見える場合がある.例えば``\texttt{[ \{SortName\} ]}''というソート宣言はエラーとならない.
しかし,実際にはこれは3つのソート ``\{'',``Sort'',``\}'' が宣言されたものとして認識される.}.

\subsection{オペレータ名}
一方,オペレータ名を構成する文字要素は上で述べた7つの可視な字句区切り文字のうち,%
1の丸括弧を除いてオペレータ名の一部として用いることが可能である%
\footnote{丸括弧はどの文脈においても``グルーピング''を表現するメタ文字として取り扱われる.}.
これらに加えて,空白文字もオペレータ名の一部として使用可能である.
例えば下は,''this is an operator'' という名前の2引数のオペレータの宣言である.
\begin{vvtm}
\begin{examplev}
module FOO {
  [ S ]
  op this is an operator : S S -> S
}
-- defining module FOO.._* done.
CafeOBJ> select FOO
FOO> sh op this       is an        operator 
.........................(this is an operator).........................
  * rank: S S -> S
  - attributes:  { prec: 0 }
FOO> 
\end{examplev}
\end{vvtm}
上の例を見て了解されるように,コマンドでオペレータ名を表記する際は%
オペレータ名を構成する連続した空白文字は無視され,1文字として扱われる.

また,mixfix オペレータの宣言において,項を表記する際の引き数位置を%
示すための下線(\verb|_|)はオペレータ名の一分として扱われる.
すなわち,コマンド類でオペレータを参照する際は下線(\verb|_|)も含めて%
指定する必要がある.コマンドの引数としてオペレータ名を指定する場合は%
次に示す例のように,下線(\verb|_|)とそれ以外の文字との間に空白文字を%
おいても良い.
\begin{vvtm}
\begin{simplev}
CafeOBJ> select NAT
NAT> sh op _+_
...............(_ + _) default attributes { assoc comm }...............
  * rank: NzNat NzNat -> NzNat
  - attributes:  { assoc comm demod prec: 33 r-assoc }
    - axioms:
      eq [:BDEMOD]: (NN:NzNat + NM:NzNat)
       = #! (+ nn nm)
      eq [:BDEMOD]: (M + N) = #! (+ m n)
  * rank: Nat Nat -> Nat
  - attributes:  { assoc comm idr: 0 demod prec: 33 r-assoc }
    - axioms:
      eq [:BDEMOD]: (AC:Nat + (NN:NzNat + NM:NzNat))
       = (AC + #! (+ nn nm))
      eq [:BDEMOD]: (M + N) = #! (+ m n)
      eq [ident1]: (0 + X-ID:Nat) = X-ID
NAT> sh op _ + _
...............(_ + _) default attributes { assoc comm }...............
  * rank: NzNat NzNat -> NzNat
  - attributes:  { assoc comm demod prec: 33 r-assoc }
    - axioms:
      eq [:BDEMOD]: (NN:NzNat + NM:NzNat)
       = #! (+ nn nm)
      eq [:BDEMOD]: (M + N) = #! (+ m n)
  * rank: Nat Nat -> Nat
  - attributes:  { assoc comm idr: 0 demod prec: 33 r-assoc }
    - axioms:
      eq [:BDEMOD]: (AC:Nat + (NN:NzNat + NM:NzNat))
       = (AC + #! (+ nn nm))
      eq [:BDEMOD]: (M + N) = #! (+ m n)
      eq [ident1]: (0 + X-ID:Nat) = X-ID
NAT> 
\end{simplev}
\end{vvtm}

\section{字句区切り文字の設定}
システムに組み込まれた字句区切り文字を追加するためのコマンドを新たに導入した.
本コマンドは新規の字句区切り文字の導入によるインパクトを評価するために用意したものであり,
将来的なCafeOBJ言語の字句区切り文字の拡張のための試験用に利用することを想定している.
\begin{vvtm}
\begin{simplev}
<Delimiterコマンド> ::= delimiter { + | - } "{" <文字> ... "}"
\end{simplev}
\end{vvtm}
\texttt{+}が指定された場合,\texttt{<文字>}で指定した文字を新たな字句など区切り文字として指定する.
逆に,新たに導入された字句区切り文字をキャンセルするには\texttt{-}を指定する.
本コマンドによって,システムに組み込みの字句区切り文字は影響を受けない(組み込みの字句区切り文字を
\texttt{-}指定によって字句区切り文字で無くすることは出来ない.

\section{モジュールの名前空間の表示}
\subsection{namesコマンド}
\label{sec:names-command}
今回新たに導入された \texttt{names} コマンドによって,
指定のモジュール内で可視の名前の一覧を見ることが出来る.
構文は下の通り:
\begin{vvtm}
\begin{simplev}
<名前表示コマンド>  ::= names [<モジュール式>] .
\end{simplev}
\end{vvtm}

\texttt{<モジュール式>}を省略すると,現在の文脈(モジュール)で%
可視の名前を表示する.
名前の表示はアルファベット順が原則であるが,
mixfix オペレータについては最後にまとめて表示される.

例: 下の例のモジュールFOOは組み込みモジュールのNATを輸入している.
その際に,ソートNatをNaturalに,ソート\_+\_ をplusと名前を付け替えている.
また,モジュール輸入構文で新たに導入された\texttt{as}指定によって%
\texttt{NAT *\{sort ....\}}のモジュールをNATURALという名前で参照できるように%
している.

\begin{vvtm}
\begin{examplev}
CafeOBJ> mod FOO { inc as NATURAL (NAT *{sort Nat -> Natural, op _+_ -> plus}) }
-- defining module FOO
; Loading /usr/local/cafeobj-1.4/lib/nat.bin
-- defining module! NAT
....
\end{examplev}
\end{vvtm}
上のモジュールFOOに対して\texttt{names}コマンドによって%
可視の名前を表示した結果を以下に示す.
\begin{vvtm}
\begin{examplev}
CafeOBJ> names FOO .

** [*] -----------------------------------------
*Cosmos*  
  - sort declared in CHAOS:UNIVERSAL
*HUniversal* 
  - hidden sort declared in CHAOS:UNIVERSAL
*Universal* 
  - sort declared in CHAOS:UNIVERSAL
** [:] -----------------------------------------
:BDEMOD   
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (s NN:NzNat) = #! (1+ nn)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat >= NM:NzNat)
     = #! (>= nn nm)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat > NM:NzNat)
     = #! (> nn nm)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat <= NM:NzNat)
     = #! (<= nn nm)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat < NM:NzNat)
     = #! (< nn nm)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat quot NM:NzNat)
     = #! (if (> nn nm) (truncate nn nm) 1)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: (NN:NzNat * NM:NzNat)
     = #! (* nn nm)
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: d(NN:NzNat,NM:NzNat)
     = #! (if (= nn nm) 1 (abs (- nn nm)))
  - axiom declared in NZNAT * { ... }
    eq [:BDEMOD]: plus(NN:NzNat,NM:NzNat)
     = #! (+ nn nm)
  - axiom declared in NATURAL
    eq [:BDEMOD]: (p NN:NzNat) = #! (- nn 1)
  - axiom declared in NATURAL
    eq [:BDEMOD]: (s 0) = 1
  - axiom declared in NATURAL
    eq [:BDEMOD]: (N:Natural >= 0) = true
  - axiom declared in NATURAL
  \end{examplev}
  \end{vvtm}
  \begin{vvtm}
  \begin{examplev}
    eq [:BDEMOD]: (0 >= NN:NzNat) = false
  - axiom declared in NATURAL
    eq [:BDEMOD]: (NN:NzNat > 0) = true
  - axiom declared in NATURAL
    eq [:BDEMOD]: (0 > N:Natural) = false
  - axiom declared in NATURAL
    eq [:BDEMOD]: (0 <= N:Natural) = true
  - axiom declared in NATURAL
    eq [:BDEMOD]: (NN:NzNat <= 0) = false
  - axiom declared in NATURAL
    eq [:BDEMOD]: (0 < NN:NzNat) = true
  - axiom declared in NATURAL
    eq [:BDEMOD]: (N:Natural < 0) = false
  - axiom declared in NATURAL
    eq [:BDEMOD]: (NN:NzNat divides M:Natural)
     = #! (= 0 (rem m nn))
  - axiom declared in NATURAL
    eq [:BDEMOD]: (M:Natural rem NN:NzNat)
     = #! (rem m nn)
  - axiom declared in NATURAL
    eq [:BDEMOD]: (M:Natural quo NN:NzNat)
     = #! (truncate m nn)
  - axiom declared in NATURAL
    eq [:BDEMOD]: (N:Natural * 0) = 0
  - axiom declared in NATURAL
    eq [:BDEMOD]: plus(M:Natural,N:Natural)
     = #! (+ m n)
  - axiom declared in NATURAL
    eq [:BDEMOD]: sd(M:Natural,N:Natural)
     = #! (abs (- m n))
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
** [B] -----------------------------------------
BASE-BOOL 
  - indirect sub-module
BOOL      
  - indirect sub-module
Bool      
  - sort declared in TRUTH-VALUE
  - operator:
    op Bool : -> SortId { constr prec: 0 }
        -- declared in module TRUTH-VALUE
** [C] -----------------------------------------
CHAOS:PARSER 
  - indirect sub-module
CHAOS:UNIVERSAL 
  - indirect sub-module
** [D] -----------------------------------------
d         
  - operator:
    op d : NzNat NzNat -> NzNat { comm demod prec: 0 }
        -- declared in module NZNAT * { ... }
** [E] -----------------------------------------
EQL       
  - indirect sub-module
** [F] -----------------------------------------
false     
  - operator:
    op false : -> Bool { constr prec: 0 }
        -- declared in module TRUTH-VALUE
** [I] -----------------------------------------
ident0    
  - axiom declared in NZNAT * { ... }
    eq [ident0]: (1 * X-ID:NzNat) = X-ID
ident1    
  - axiom declared in NATURAL
    eq [ident1]: plus(0,X-ID:Natural)
     = X-ID
ident2    
  - axiom declared in NATURAL
    eq [ident2]: (1 * X-ID:Natural)
     = X-ID
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
** [N] -----------------------------------------
Natural   
  - sort declared in NAT-VALUE * { ... }
  - operator:
    op Natural : -> SortId { constr prec: 0 }
        -- declared in module NAT-VALUE * { ... }
NATURAL   
  - direct sub-module, alias of module NAT *{  ...  }
NzNat     
  - sort declared in NZNAT-VALUE
  - operator:
    op NzNat : -> SortId { constr prec: 0 }
        -- declared in module NZNAT-VALUE
NZNAT-VALUE 
  - indirect sub-module
** [P] -----------------------------------------
plus      
  - operator:
    op plus : Natural Natural -> Natural { assoc comm idr: 0 demod
                                           prec: 0 r-assoc }
        -- declared in module NATURAL
    op plus : NzNat NzNat -> NzNat { assoc comm demod prec: 0 r-assoc }
        -- declared in module NZNAT * { ... }
** [S] -----------------------------------------
sd        
  - operator:
    op sd : Natural Natural -> Natural { comm demod prec: 0 }
        -- declared in module NATURAL
SortId    
  - sort declared in CHAOS:PARSER
  - operator:
    op SortId : -> SortId { constr prec: 0 }
        -- declared in module CHAOS:PARSER
SyntaxErr 
  - sort declared in CHAOS:PARSER
  - operator:
    op SyntaxErr : -> SortId { constr prec: 0 }
        -- declared in module CHAOS:PARSER
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
** [T] -----------------------------------------
true      
  - operator:
    op true : -> Bool { constr prec: 0 }
        -- declared in module TRUTH-VALUE
TRUTH     
  - indirect sub-module
TRUTH-VALUE 
  - indirect sub-module
TypeErr   
  - sort declared in CHAOS:PARSER
  - operator:
    op TypeErr : -> SortId { constr prec: 0 }
        -- declared in module CHAOS:PARSER
** [Z] -----------------------------------------
Zero      
  - sort declared in NAT-VALUE * { ... }
  - operator:
    op Zero : -> SortId { constr prec: 0 }
        -- declared in module NAT-VALUE * { ... }
** [_] -----------------------------------------
_ Bottom _ 
  - sort declared in CHAOS:UNIVERSAL
_ HBottom _ 
  - hidden sort declared in CHAOS:UNIVERSAL
(if _ then _ else _ fi) 
  - operator:
    op if _ then _ else _ fi : Bool *Cosmos* *Cosmos* -> *Cosmos* { strat: (1 0)
                                                                    prec: 0
                                                                    }
        -- declared in module TRUTH
(not _)   
  - operator:
    op not _ : Bool -> Bool { strat: (0 1) prec: 53 }
        -- declared in module BASE-BOOL
(p _)     
  - operator:
    op p _ : NzNat -> Natural { demod prec: 15 }
        -- declared in module NATURAL
(parsed:[ _ ], rest:[ _ ]) 
  - operator:
    op parsed:[ _ ], rest:[ _ ] : *Universal* *Universal* -> SyntaxErr
                                  { prec: 0 }
        -- declared in module CHAOS:PARSER
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
(s _)     
  - operator:
    op s _ : NzNat -> NzNat { demod prec: 15 }
        -- declared in module NZNAT * { ... }
    op s _ : Natural -> NzNat { demod prec: 15 }
        -- declared in module NATURAL
(_ * _)   
  - operator:
    op _ * _ : NzNat NzNat -> NzNat { assoc comm idr: 1 demod prec: 31
                                      r-assoc }
        -- declared in module NZNAT * { ... }
    op _ * _ : Natural Natural -> Natural { assoc comm idr: 1 demod
                                            prec: 31 r-assoc }
        -- declared in module NATURAL
(_ := _)  
  - operator:
    pred _ := _ : *Cosmos* *Cosmos*  { prec: 51 }
        -- declared in module TRUTH
(_ :is _) 
  - operator:
    pred _ :is _ : *Cosmos* SortId  { prec: 125 }
        -- declared in module TRUTH
(_ < _)   
  - operator:
    pred _ < _ : NzNat NzNat  { demod prec: 51 }
        -- declared in module NZNAT * { ... }
    pred _ < _ : Natural Natural  { demod prec: 51 }
        -- declared in module NATURAL
(_ <= _)  
  - operator:
    pred _ <= _ : NzNat NzNat  { demod prec: 51 }
        -- declared in module NZNAT * { ... }
    pred _ <= _ : Natural Natural  { demod prec: 51 }
        -- declared in module NATURAL
(_ = _)   
  - operator:
    pred _ = _ : *Cosmos* *Cosmos*  { comm prec: 51 }
        -- declared in module EQL
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
(_ =*= _) 
  - operator:
    pred _ =*= _ : *HUniversal* *HUniversal*  { prec: 51 }
        -- declared in module TRUTH
(_ =/= _) 
  - operator:
    pred _ =/= _ : *Cosmos* *Cosmos*  { prec: 51 }
        -- declared in module TRUTH
(_ == _)  
  - operator:
    pred _ == _ : *Cosmos* *Cosmos*  { prec: 51 }
        -- declared in module TRUTH
(_ =b= _) 
  - operator:
    pred _ =b= _ : *Cosmos* *Cosmos*  { prec: 51 }
        -- declared in module TRUTH
(_ > _)   
  - operator:
    pred _ > _ : NzNat NzNat  { demod prec: 51 }
        -- declared in module NZNAT * { ... }
    pred _ > _ : Natural Natural  { demod prec: 51 }
        -- declared in module NATURAL
(_ >= _)  
  - operator:
    pred _ >= _ : NzNat NzNat  { demod prec: 51 }
        -- declared in module NZNAT * { ... }
    pred _ >= _ : Natural Natural  { demod prec: 51 }
        -- declared in module NATURAL
(_ and _) 
  - operator:
    op _ and _ : Bool Bool -> Bool { assoc comm prec: 55 r-assoc }
        -- declared in module BASE-BOOL
(_ and-also _) 
  - operator:
    op _ and-also _ : Bool Bool -> Bool { strat: (1 0 2) prec: 55
                                          r-assoc }
        -- declared in module BASE-BOOL
\end{examplev}
\end{vvtm}
\begin{vvtm}
\begin{examplev}
(_ divides _) 
  - operator:
    pred _ divides _ : NzNat Natural  { demod prec: 51 }
        -- declared in module NATURAL
(_ iff _) 
  - operator:
    op _ iff _ : Bool Bool -> Bool { strat: (0 1 2) prec: 63 r-assoc }
        -- declared in module BASE-BOOL
(_ implies _) 
  - operator:
    op _ implies _ : Bool Bool -> Bool { strat: (0 1 2) prec: 61
                                         r-assoc }
        -- declared in module BASE-BOOL
(_ or _)  
  - operator:
    op _ or _ : Bool Bool -> Bool { assoc comm prec: 59 r-assoc }
        -- declared in module BASE-BOOL
(_ or-else _) 
  - operator:
    op _ or-else _ : Bool Bool -> Bool { strat: (1 0 2) prec: 59
                                         r-assoc }
        -- declared in module BASE-BOOL
(_ quo _) 
  - operator:
    op _ quo _ : Natural NzNat -> Natural { demod prec: 41 }
        -- declared in module NATURAL
(_ quot _) 
  - operator:
    op _ quot _ : NzNat NzNat -> NzNat { demod prec: 31 l-assoc }
        -- declared in module NZNAT * { ... }
(_ rem _) 
  - operator:
    op _ rem _ : Natural NzNat -> Natural { demod prec: 31 l-assoc }
        -- declared in module NATURAL
(_ xor _) 
  - operator:
    op _ xor _ : Bool Bool -> Bool { assoc comm prec: 57 r-assoc }
        -- declared in module BASE-BOOL
CafeOBJ> 
\end{examplev}
\end{vvtm}

\subsection{look up コマンド}
\label{sec:lookup-command}
\texttt{look up} コマンドは,指定のあるいは現在文脈のモジュールにおいて,%
ある名前で参照されるものが何であるかを表示する.
構文は次の通りである.
\begin{vvtm}
\begin{simplev}
<LOOK UPコマンド>    ::= lookup [in <モジュール名> :] <識別子> | <オペレータ名> .
\end{simplev}
\end{vvtm}
例:この例は,先に第~\ref{sec:names-command}章で見たモジュールFOO内で%
\texttt{plus}という名前で参照されるものが何であるかを表示したものである.
\begin{vvtm}
\begin{simplev}
CafeOBJ> look up in FOO : plus .

** [P] -----------------------------------------
plus      
  - operator:
    op plus : Natural Natural -> Natural { assoc comm idr: 0 demod
                                           prec: 0 r-assoc }
        -- declared in module NATURAL
    op plus : NzNat NzNat -> NzNat { assoc comm demod prec: 0 r-assoc }
        -- declared in module NZNAT * { ... }
CafeOBJ> select FOO
FOO> look up Natural
.

** [N] -----------------------------------------
Natural   
  - sort declared in NAT-VALUE * { ... }
  - operator:
    op Natural : -> SortId { constr prec: 0 }
        -- declared in module NAT-VALUE * { ... }
FOO> 
\end{simplev}
\end{vvtm}

\end{document}


%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End: