跳转到内容

奥托 (编程语言)

维基教科书,自由的教学读本

奥托(Otto)是一种实用性编程语言,具有着独特的易用性。它的对象数据类型是与XML相类似的结构化数据,而所需编写的程序也并非复杂的语句,而是简单但却功能强大的表达项(term)集合,因此非常适用于初级教育。随着硬件对技术发展的限制将会越来越小,易用性,易记性以及易懂性将渐趋重要。此外,奥托无需充分理解微积分原理,即可利用它辅助进行微积分运算。最后,在网络应用方面奥托也有着可以施展的领域。

介绍

[编辑]

奥托的设计是依据以下几点原则而进行的: 引入“表档”(tabment,演化自英文“表格”table和“文档”document)的概念,使之适用于初级学生: “表档”是一个广义的概念。它可以指表格、文档、多元集合、列表或是元组。表档内容必须是可以直观而清晰的重现在纸上的。

尽管奥托的程序仅是基本的表达项,但已能够满足日常工作的需要: 表达项(3+5)*7 就是一个简单的奥托程序。如果我们将其中的运算符号改用其它操作代替,又或是将其中的数字改成别的表达项、表达项格式(scheme of term)、条件、赋值项,得到的依然是一个有意义的程序。这就意味着,程序的每一步都可以被独立的提取出来进行研究,而不需考虑前后项的影响。

结构严谨性使其更适合于教学用: 随着软件与硬件性能的提高,它们已不再是程序运行的主要瓶颈所在。我们可以肯定的说,未来的个人电脑将会拥有更高的处理频率,更大的一级、二级存储空间。但未来的学校却有可能化费三年的时间来教授一门计算机编程语言么?因此对一门为教学而设的编程语言来说,是否能让人们轻松的掌握比运行效率更为重要。

对于操作命令的解释,一个简单的算法描述要比描述性的逻辑定义更加容易为用户所理解接受: 我们可以在数据库操作“合并”(join)部分看到这方面的例子。

奥托的操作命令应当可以不依赖于计算机而进行教学: 比如基本的四则运算,大数的运算应当能够在纸媒体,黑板或其它设备上进行解释。


一门适合的教学语言应具有的特性

[编辑]
  • 良好的可靠性
  • 易于学习
  • 易于记忆
  • 程序短小
  • 可扩展
  • 允许分段编写及解读
  • 有效率
  • 可优化
  • 可用于表格、文档、数据库、检索系统、互联网,而且适用于数学计算
  • 适用于渐进性教学步骤

奥托中使用的数据类型及对象

[编辑]

本节将初步介绍在奥托中所使用到的一些数据类型及对象:

基本类型

[编辑]
  • 字符串(TEXT)
  • 整形(ZAHL)
  • 浮点型(PZAHL)
  • 布尔型(BOOL)
  • 筹型(BAR)- 筹型是奥托所引入的特殊数据类型,只有一个值“|”

类型构建函数

[编辑]
  • 元组构建函数(TUPLE-constructor):

例如 typos(PERSON)=(FIRSTNAME, LASTNAME, LOCATION)
将会构建一个由三个元素名、姓、住址所构成的数组“个人”

  • 集合(COLLECTIONS):

例如 奥托中的集合可分为四个不同的类型

    • 集 M 比如 typos(PERSONS)=M(PERSON)就将PERSONS定义为所有PERSON类的集合,集合内有序并且无冗余元素;
    • 合 B 多元集合 B(PERSON),此集合内有序,而且存在冗余元素;
    • 列 L 列表结构表示,元素按数据文件存储(或输入)顺序排列;
    • 任意集 ANY 这里面允许容纳各类不同元素;
  • 准函数(?):可以容纳一个元素,但也可以为空;可有可无;
  • 选择函数(|):两者择一,候选项由|符隔开,例如 (AUTHOR|EDITOR)。

对象

[编辑]

1. 数字

[编辑]
数字的表现格式为<<数字类型::数字值>>, 效果相当于为每个数字加上一对类型标签,例如:
33 的表现格式为: <<ZAHL::33>>, 等效于XML格式的: <ZAHL>33</ZAHL>。
33.7 的表现格式为: <<PZAHL::33.7>>

2. 字符串

[编辑]
与数字表示方法类似,如果想为字符串赋以一个独特的名字坐标记,可先定义该名字为字符串类型,然后再为该名字赋值。例如:
输入姓名列侬,类别为姓
typos(LASTNAME) = TEXT  /定义元组LASTNAME的类型是字符串
<<LASTNAME:: Lennon>>  /为LASTNAME元组赋值列侬
以上操作可简写为以下操作:
<<LASTNAME::<<TEXT::LENNON>>::LASTNAME>>
均等同于XML中的
<LASTNAME>Lennon</LASTNAME>

3. 更复杂的字符串表示方法

[编辑]
可以使用嵌套的方式,比如我们想要在上面一个例子的基础上细分姓和名为不带空格的字符串WORD:
typos(NAME) = (WORD, WORD)
<<NAME:: John Lennon>>
可简写为:
<<NAME::<<WORD::John>><<WORD::Lennon>>::NAME>>
相应的XML文档为:
<NAME>
<FIRSTNAME>John</FIRSTNAME>
<LASTNAME>Lennon</LASTNAME>
</NAME>
如果想要附加上一个可有可无的中间名,则可以改为:
typos(NAME) = (WORD, WORD*, WORD)
这样我们就可以省去姓、名、中间名三个标签,而只用一个名称标签实现。

4. 集合

[编辑]
需要先定义集合里元素的类型以及集合本身的类型,然后列出集合里的每一个元素,格式如下:
<<集合类型(集合名称)::集合元素>>
例如我们想组建一组学生的成绩集合,可以这样表示:
typos(MARK) = ZAHL
<<L(MARK)::1 2 1 3 2 4 5 1>>
这等同于XML里的:
<MARKS>
12
13
24
51</MARKS>

5. 元组的集合

[编辑]
类似于元素集合,例如各个科目的成绩集合
<<L( SUBJECT   L( MARK))::
    Maths     1 2 1 3 4
    English   4 2 2 3 4 5
    German    1 2 1 2
>>

6. 扩展的集合

[编辑]
与以上类似,例如:
<<M( NAME      LOCATION   FACULTY M( SUBJECT           MARK))::
     Lennon   Liverpool   Music      Music		1
                                     Maths		2
                                     Art		2
     Benndorf Magdeburg   Maths      Art		2
                                     Music              3
...>>

7. 集合嵌套

[编辑]
形如
typos(STUDENTS) = M(STUDENT)
typos(STUDENT) = (NAME, LOCATION, FACULTY, YEAR_OF_BIRTH, M(EXAM), M(HOBBY))
typos(EXAM) = (SUBJECT, MARK)
<<STUDENTS::
<< NAME   LOCATION  FACULTY YEAR_OF_BIRTH::
   Lennon Liverpool Music   1947>>
<<M( SUBJECT MARK)        M( HOBBY)::
       Music 1 	   Music
       Maths 2 	   Swimming
       Art   2 >>
<< NAME     LOCATION  FACULTY YEAR_OF_BIRTH::
   Benndorf Magdeburg Maths   1955>>
<<M( SUBJECT MARK)        M( HOBBY)::
      ART    2 	   Jogging
      Music  3 >>
 ::STUDENTS>>


典型的奥托数据库查询范例

[编辑]

本节我们将以以下数据库为例,进行一些基本的查询操作。 (奥托操作关键字请查询附录1中的列表) 为了便于您的理解,我们将以一个中文表档举例,但是请注意,实际操作并不支持中文!! (原始文档请参考附录2)

typos(STUDENTS.xml) = STUDENTS 
typos(COURSES.xml) = M(科目, 学时?, 教授?) 
typos(FACULTIES.xml) = M(院系) 
typos(STUDENTS) = M(学生) 
typos(学生) = (学号, 姓, 名, 住址, 街道, 出生时间, 专业, 注册时间, 性别, M(考试), M(爱好)) 
typos(考试) = 科目, 成绩 
typos(院系) = (专业, 院长,生员数)

同时,我们给出了一个基于STUDENTS.xml的表档文件,并对此表档文件进行查询:

<<STUDENTS::
<< 学号    姓        	名	住址	街道	专业
	 	1	马	汉思	武汉	江汉路 1	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				DB	2.0	钓鱼
				EAD	3.7	
				MATHE	1.3 >>

<< 学号    姓        	名	住址	街道	专业
		2		穆	安洁	上海	南京路 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	女 >>
		<< M(	科目	成绩)	M(爱好) ::
			DB	2.0	读书
				EAD	1.3	游泳
				MATHE	4.0 >>

<< 学号    姓        	名	住址	街道	专业
		3		舒	迈柯	北京	王府井 1	数学
		<< 注册时间	出生时间	性别 ::
			1999	1979	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				ALGEB	1.3	象棋
				ANALY	1.0
				NUM	1.7
				STOCH	4.0 >>

<< 学号    姓        	名	住址	街道	专业
		4		史	马克	上海	浦东 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2001	1976	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	1.3	足球
				MATHE	4.0 >>

<< 学号    姓        	名	住址	街道	专业
		5		梅	富力	武汉	中山路 19	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2000	1978	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	3.0	足球
				GRAFIK	1.3	手球
				MATHE	2.0 >>

<< 学号    姓        	名	住址	街道	专业
		6		张	力	武汉	珞珈山 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2002	1978	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				MATHE	2.7 >>

<< 学号    姓        	名	住址	街道	专业
		7		潘	娜丁	武汉	珞珈山 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2002	1980	女
		<< M(	科目	成绩)	M(爱好) ::
				GRAFIK	1.0	骑马
				MATHE	3.0 >>

<< 学号    姓        	名	住址	街道	专业
		8		梅	富力	武汉	建设大道 5	数学
		<< 注册时间	出生时间	性别 ::
			1998	1979	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				DB	1.3	足球
				EAD	3.0	读书
				LOGIK	1.7
				MATHE	2.7
				TECHINF	2.0 >>
 ::STUDENTS>>

例 1

[编辑]
显示“集”“合”“列”与 “?”几个概念间的区别
	aus STUDENTS.xml
	gib M(专业), B(专业), L(专业), 专业?
	<<	M(专业)	B(专业)	L(专业)	专业?:: 	
		信息工程	信息工程	信息工程	信息工程
		数学		信息工程	信息工程
				信息工程	数学
				信息工程	信息工程
				信息工程	信息工程
				信息工程	信息工程
				数学	信息工程
				数学	数学 >>
由上例可见,这四种类型的区别所在:“集”是集中元素归纳后的种类列举;“合”是所有元素排序后的集合;“列”是未经排序的集合;“?”则是随机项。

例 2

[编辑]
a) 选择所有来自上海的学生,列出所有栏目
	aus STUDENTS.xml
	mit 住址 = “上海”
<<STUDENTS ::
<< 学号    姓        	名	住址	街道	专业
		2		穆	安洁	上海	南京路 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	女 >>
		<< M(	科目	成绩)	M(爱好) ::
			DB	2.0	读书
				EAD	1.3	游泳
				MATHE	4.0 >>
<< 学号    姓        	名	住址	街道	专业
		4		史	马克	上海	浦东 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2001	1976	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	1.3	足球
				MATHE	4.0 >>
	:: STUDENTS >>
b) 选择所有来自上海的学生,但只列出姓、名、专业,并按此排序
	aus STUDENTS.xml
	mit 住址 = “上海”
	gib B(姓, 名, 专业)
 <<B(姓	名	专业) ::
 	穆	安洁	信息工程
 	史	马克	信息工程 >>
c) 选择所有来自上海的学生,列出姓、名以外的所有栏目
		aus STUDENTS.xml
		mit 住址 = “上海”
		bila 姓, 名
<<STUDENTS ::
<< 学号    	住址	街道	专业
		2		上海	南京路 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	女 >>
		<< M(	科目	成绩)	M(爱好) ::
			DB	2.0	读书
				EAD	1.3	游泳
				MATHE	4.0 >>
<< 学号    	住址	街道	专业
		4		上海	浦东 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2001	1976	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	1.3	足球
				MATHE	4.0 >>
 	:: STUDENTS >>

例 3

[编辑]
选择所有来自武汉的学生,并按年龄分组,每5年一组
	aus STUDENTS.xml
	mit 住址 = “武汉”
	ext 年龄组 := 5*integer((2004-出生时间)/5)
	gib M(专业, M(年龄组, B(姓, 名)))
	<<M(	专业		M(	年龄组 B(	姓	名	))) ::
		信息工程			20	马	汉思
							穆	安洁
							潘	娜丁
						25	张	力
							梅	富力
							史	马克
		数学				20	梅	富力
							舒	迈柯 >>		

例 4

[编辑]
出所有来自武汉学生的:总平均分,专业平均分,年平均分,个人平均分。
	aus STUDENTS.xml
	mit 住址 = “武汉”
	gib 平均分, M(专业,平均分, M(注册时间,平均分, B(姓,平均分)))
		平均分 := avg(成绩)
<< 平均分	M( 专业	平均分 M(注册时间	平均分 B(	姓	平均分))) ::
	2.2		信息工程	2.2	1998	2.1	梅	2.1
					2000	2.3	马	2.3
					2002	2.2	张	2.7
							潘	2.0
			数学	2.1	1998	2.1	梅	2.1 >>

例 5

[编辑]
a) 将信息工程学生按姓名排序,按住址分类。如果有不及格成绩,则列出
	aus STUDENTS.xml
	mit 专业 = “信息工程”
		科目:: 成绩 >= 4
	gib M(住址, B(姓, 名, M(科目, 成绩)))
	<< M(	住址      B(	姓	名	M(	科目	成绩))) ::
		上海	穆	安洁		MATHE	4.0
				史	马克		MATHE	4.0
		武汉	张	力
				梅	富力
				马	汉思
				潘	娜丁 >>		

b) 对于信息工程学生中有不及格成绩的,列出他们的所有成绩
	aus STUDENTS.xml
	mit 专业 = “信息工程”
		成绩 >= 4
	gib M(住址, B(姓, 名, M(科目, 成绩))) 
	<< M(	住址      B(	姓	名	M(	科目	成绩))) ::
		上海	穆	安洁		DB	2.0
							EAD	1.3
							MATHE	4.0
				史	马克		EAD	1.3
							MATHE	4.0 >>
		
c) 对于信息工程学生中有不及格成绩的,列出他们不及格的成绩
	aus STUDENTS.xml
	mit 专业 = “信息工程”
		科目:: 成绩 >= 4
		成绩 >= 4
	gib M(住址, B(姓, 名, M(科目, 成绩)))
	<< M(	住址      B(	姓	名	M(	科目	成绩))) ::
		上海	穆	安洁		MATHE	4.0
			史	马克	MATHE	4.0 >>

例 6

[编辑]
给出只有武汉和北京学生的注册时间
	aus STUDENTS.xml
	gib M(注册时间, 址)
		typos(址) = M(住址)
	mit 址 inclu M(“武汉”, ”北京”)
	bila 址
	<<  M (注册时间)
			1998
			2000
			2002 >>

例 7

[编辑]
a) 找出数学成绩为2的学生
		aus STUDENTS.xml
		mit 科目 = “MATHE” and “成绩” = 2
	<<STDENTS::
<< 学号    姓        	名	住址	街道	专业
		5		梅	富力	武汉	中山路 19	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2000	1978	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	3.0	足球
				GRAFIK	1.3	手球
				MATHE	2.0 >>
	::STUDENTS>>
b) 找出有数学成绩,并且有一门科目成绩为2的学生
		aus STUDENTS.xml
			mit 科目 = “MATHE” 
				“成绩” = 2
<<STDENTS::
<< 学号    姓        	名	住址	街道	专业
	 	1	马	汉思	武汉	江汉路 1	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				DB	2.0	钓鱼
				EAD	3.7	
				MATHE	1.3 >> 
<< 学号    姓        	名	住址	街道	专业
		2		穆	安洁	上海	南京路 4	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			1999	1979	女 >>
		<< M(	科目	成绩)	M(爱好) ::
			DB	2.0	读书
				EAD	1.3	游泳
				MATHE	4.0 >> 
<< 学号    姓        	名	住址	街道	专业
		5		梅	富力	武汉	中山路 19	信息工程 >>
		<< 注册时间	出生时间	性别 ::
			2000	1978	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				EAD	3.0	足球
				GRAFIK	1.3	手球
				MATHE	2.0 >> 
<< 学号    姓        	名	住址	街道	专业
		8		梅	富力	武汉	建设大道 5	数学
		<< 注册时间	出生时间	性别 ::
			1998	1979	男 >>
		<< M(	科目	成绩)	M(爱好) ::
				DB	1.3	足球
				EAD	3.0	读书
				LOGIK	1.7
				MATHE	2.7
				TECHINF	2.0 >>
 ::STUDENTS>>


简单的计算

[编辑]

本节我们将通过几个例子来看看奥托是如何通过表档进行简单计算的:

例 1

[编辑]
计算长宽分别为1.754和3.678的矩形面积和周长
	<<	宽	长 ::
		1.745	3.678>> 
	ext  面积 := 宽 * 长
		周长 := 2 * (长+宽)
 	<< 宽	长	面积	周长 ::
		1.745	3.678	4.67	10.87 >>

例 2

[编辑]
计算圆柱体底面积和体积
	<< L (	半径	高)::
			1.234	3
			4.56	2
			7.89	9 >>
	ext 底面积 = 3.14159 * 半径 * 半径
		体积 = 底面积 * 高
	<< L (	半径	高    	底面积	体积)::
			1.234	3	4.784	14.352
			4.56	2	65.325	130.65
			7.89	9 	195.571	1760.139 >>

例 3

[编辑]
10993是质数吗?
	aus <<L(DIV)::2 to 110
	ext E := (10993 mod DIV != 0)
	all
或者
	aus <<L(DIV) :: 2 to 110>>
	gib RESULT
		RESULT := all(10993 mod DIV !=0)

例 4

[编辑]
使用“筛法”计算100到200之间的素数
	aus << L(PRIM):: 100 to 100 >>
	mit DIVS := <<L(DIV):: 2 to to_int(sqrt(PRIM))>> at PRIM
	   gib S(PRIM, IS_PRIM)
			IS_PRIM := all( PRIM mod DIV != 0)
	mit IS_PRIM
	bila IS_PRIM

例 5

[编辑]
使用欧几理德算法计算200和13的最大公约数
	ext A := 200
		B := 13
		L(X,Y,R)[1; N+1 to R = 0] := [A, B, A mod B;
						Y[N], R[N], Y[N] mod R[N]]

例 6

[编辑]
计算容积为2的立方体边长
	ext LX := <<L(X):: 1 to 1.5 step 0.001>>
	mit X**3 <= 2
		X:: POSITIONBACK = 1
	ext Y := X**3

例 7

[编辑]
给出sin(x)及其一阶导数
	aus <<L(X):: -3 to 3 step 0.01>>
	ext DELTA := 0.0001
		SINUS := sin(X)
		DERIVAATION := (sin(X+DELTA)-sin(X)) / DELTA
	bila DELTA

例 8

[编辑]
计算一定区间内sin(x)的最大值
	aus <<L(X): 1 to 11 step 0.001>>
	ext DELTA := 0.001
			SINUS := sin(X)
	mit SINUS-sin(X-DELTA) >= 0 and SINUS-sin(X+DELTA) >= 0
	gib L(X, SINUS)

例 9

[编辑]
计算若干个数字的和
(a) 输出结果与原数字
	ext AS := <<L(A):: 3.89 4.87 8.98>>
		B := sum(AS)
(b) 只输出结果
		aus <<L(A):: 3.89 4.87 8.98>>
		sum
注意:
aus <<L(A):: 3.89 4.87 8.98>>
ext C := sum(A)
不是本问题的解,因为形如L(A,C)的表格中,和是分别取自A栏的,因此此时得到的C栏值只是单纯的A栏值的复制。

例 10

[编辑]
换算特定数值
		aus ARTICLES.xml
		ext EURO := ..PZHAL * 0.987

例 11

[编辑]
将数据分布到若干栏中
		typos(PUPILS.xml) = M(NAME, FIRSTNAME, SEX, CLASS, L(MARK))
		aus PUPILS.xml
		ext NAME_M := NAME if SEX = ”m” fi
			NAME_F := NAME if SEX = ”f” fi
		gib M(CLASS, M(BOY), M(GIRL))
			typos(BOY) = (NAME_M, FIRSTNAME, L(MARK))
			typos(GIRL) = (NAME_F, FIRSTNAME, L(MARK))
最后生成形如以下的类型
		type(PUPILS.xml) = S((NAME, NAME_F?, NAME_M?, FIRSTNAME, SEX, CLASS, L(MARK))


查询文档

[编辑]

本节我们将讨论对于文档内容的搜索与查询

typos(BOOKS.xml)=M(BOOK)
typos(BOOK)=(ISBN, TITLE, PUBLISHER, YEAR, L(AUTHOR), PREFACE, CONTENT, L(CHAPTER)), INDEX, REFERENCES)
typos(AUTHOR)=(TEXT,TEXT)
typos(CHCAPTER)=(TITLE,TEXT)
..

例1

[编辑]
查询所有作者为Ullman的书籍
	aus BOOKS.xml
	mit AUTHOR.2 = ”Ullman” 

例2

[编辑]
查询所有作者为Jeffry Ullman的书籍
	aus BOOKS.xml
	mit AUTHOR = (“Jeffry”, “Ullman”)

例3

[编辑]
查找所有“Deutscher Universitaetsverlag”出版社于1998年后出版书籍的前言部分,并以大写字母开头将其列出
	aus BOOKS.xml
	mit PUBLISHER = ”Deutscher-Universitätsverlag”
	YEAR = 1998
	ext PREWORDS := PREFACE/WORD
	mit PREWORDS.WORD:: is_capital(substr(WORD,1,1))
	gib M(TITLE, ISBN, PREWORDS)

例4

[编辑]
查询所有包含有”auto”词条的书籍
	aus BOOKS.xml
	mit “automobil” in BOOK dslash WORD

例5

[编辑]
查询标题长度大于10个字符的书籍
	aus BOOKS.xml
	ext LONGWORDS := BOOK dslash WORD
	mit length(LONGWORDS.WORD) > 10
	gib L(TITLE, LONGWORDS)

例6

[编辑]
查询所有在”references”以及”author”栏出现的姓Ullman的作者
	aus BOOKS.xml
	mit REFERENCES.WORD::succ(REFERENCES.WORD) = ”Ullman”
	ext FIRSTNAME := REFERENCES.WORD
	mit AUTHOR.2 = ”Ullman”
	ext FIRSTNAME := AUTHOR.1
	gib M(FIRSTNAME)

例7

[编辑]
在所有”Deutscher Universitaetsverlag”出版社所出版的书籍中寻找包含有“bier“或是以“Bier“开头的字段
	aus BOOKS.xml
	mit PUBLISHER = ”Deutscher-Universitätsverlag”
	// WORD ## 转成一组字段列表
	mit WORD:: substr(WORD, 1, 4) = ”Bier” or WORD like ”*bier*”

例8

[编辑]
根据给出的人名列表,自动生成相应收件人的信件。
typos(PERSONS.xml) = L(PERSON)
typos(PERSON) = (NAME, FIRSTNAME, SEX, ADDRESS)
typos(LETTER.xml) = L(TEXT | DEAR | ADDRESSPOS)
信件格式为:
<<LETTER:: Magdeburg, 9.1.2003
Klaus Benecke
Germany
<<ADDRESSPOS::Address>>
<<DEAR::Dear>>
I would like to inform you,...
 ::LETTER>>
	aus PERSONS.xml
	ext LETTER := LETTER.xml at PERSON
		MRorMRS := “Mr. ”if SEX=”m” fi “Mrs. ” else at DEAR
		NAME := NAME ^ “,” at MRorMRS
		ADDRESS := ADDRESS at ADDRESSPOS
	bila PERSON
typos(RESULT) = L(LETTER)
typos(LETTER) = L(TEXT | (DEAR, MRorMRS, NAME) | (ADDRESSPOS, ADDRESS))
当然,也许用户想要为每一个名字生成一个单独的文件,这可以通过替换最后一行达到目的
	gib L(NAME, LETTER)
	save splitted
通过这个操作,我们将每一个姓名值用于所生成单独文件的文件名,并且用它来作为相应文件的根标签。


实现简单的四则运算

[编辑]

本节我们将向读者证明,在初等教育中使用奥托进行基础四则运算的教学将会比灌输抽象的概念要更为直观,更易于理解。例如说,对于加法的教学,我们使用“算筹”这一最直观的形象,可以使用两列算筹,将第二列的算筹与第一列合并,即可来表述自然数的相加。表述乘法,比如说4乘以5,可以使用如下方法:设A组算筹为4根,对应A组中的每一根算筹,都有相应的5根算筹被放入B组,则B组的20根算筹就是我们得到的乘积,并可以被转化为十进制数字。

表达自然数的两个方法:

n = 5 = <<ZAHL:: 5>> 

对应于 bs = L( | | | | | )= <<L(BAR):: | | | | | >>

typos(NAT) = BAR* = L(BAR)
bs = to_bars(n)
n = to_nat(bs)

加法与乘法的运算方法:

12345
+   789
--------
13134
123 * 567
---------
615
 738
  861
----------
79641


优点
1. 这是最广为人知的算法(至少95%的德国人队起有所了解)
2. 高效
缺点
1. 只有不到5%的德国人能够针对这一算法进行编程
2. 这种算法只适用于一般的数据相乘,而对于数据库或是网络数据的操作则无能为力。
3. 对于“计算矩形面积”这一概念的应用不是很切合实际
4. 与需要解决的问题相比,我们所使用的算法过于复杂(德国人花了100年时间才认识到使用十进制数字进行运算要比使用罗马数字来的方便)
type nat = Zero
		| 自然数首先置零;;

加法与乘法

[编辑]

例1

[编辑]
2+2 可表示为
add (Succ(Succ Zero)) (Succ(Succ Zero));;
	-: nat = Succ (Succ (Succ (Succ Zero)))

例2

[编辑]
3*3 可表示为
mult (Succ(Succ(Succ Zero))) (Succ(Succ(Succ Zero)));;
	- : nat = Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))

例3

[编辑]
27 + 98
aus to_bars(27), to_bars(98)
	gib L(BAR)
	to_nat
或:
ext A := to_bars(27)
	C := to_bars(98)
	gib L(BAR)
	to_nat
	or shorter:
	to_bars(27) bing to_bars(98) ## bing: 即“并”
	to_nat

例4

[编辑]
4 * 5 可以有以下多种表示方法
aus <<L(A):: 1 to 4>>
	ext L( | | | | |) at A
	gib L(BAR)
	to_nat
ext A:= to_bars(4)
	B:= to_bars(5) at BAR
	gib L(B)
	gib L(BAR)
	to_nat
aus <<L(A):: 1 to 4 >>
	ext B[1; N+1] := [5; B[N] + 5]
	mit A = 4
	gib B
aus <<L(A):: | * 4 >>
	ext <<L(B):: | * 5 >> at A
	gib L(B)
	to_nat
	aus <<L(A):: | | | | >>
	ext <<L(B):: | | | | | >> at A
	gib L(B)
	to_nat

减法

[编辑]

例5

[编辑]
98 – 27
	to_bars(98) yi to_bars(27)
	to_nat

除法

[编辑]

例6

[编辑]
981 除以 3
	ext L(A, B)[1; N+1 to B>981] :=[1, 3; A[N]+1, B[N] + 3]
	mit POSITIONBACK = 2
	gib A


附录

[编辑]

奥托命令集合

[编辑]

奥托网站(Otto-Website)

关键字查询表(xml格式)

学生管理文件范例

[编辑]

students文件(xml格式)

参考网站

[编辑]

马格德堡大学 XML-Anfragesprachen