奧托 (程式語言)
奧托(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