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:
|