Talk is cheap, show me the code.——Linus Torvalds
我将贴出一些来自《形式化验证》课程中的一些作业,并且在代码之后会附着一些关键的讲解。在我看来,看manual来学语言和思想,太慢了,看code学习才是最具效率的。
Natural Number
fmod PNAT is
sort Nat .
op 0 : -> Nat .
op s_ : Nat -> Nat .
vars Y X : Nat .
op _+_ : Nat Nat -> Nat [assoc comm] .
op _*_ : Nat Nat -> Nat [assoc comm] .
eq 0 + X = X .
eq s X + Y = s (X + Y) .
eq 0 * X = 0 .
eq s X * Y = (X * Y) + Y .
endfm
这是一个描写了自己定义的实数类型,pnat。
op是operation的意思,表名一个操作。其中认为 0 是 Nat。
_ 代表是一个参数的。s_表示这个参数的后继。很明显,在实数范围内,任意实数的后继都是实数,自然数也是如此
assoc 表示结合律
comm 表示交换律
vars 声明了两个自然数的变量,X、Y
eq是equation,用等式来定义了之前声明的op
sX代表变量X的后继。
在maude中,用以下两行代码来检测加法和乘法。
red s 0 + s 0 0 .
red s s 0 * s s s 0 .
List
一个LIst的定义
fmod LIST-NAT is
protecting NAT .
sort List-Nat .
subsort Nat < List-Nat .
sort List-NatPair .
op <_;_> : List-Nat List-Nat -> List-NatPair [ctor] .
op nil : -> List-Nat [ctor] .
op _,_ : List-Nat List-Nat -> List-Nat [ctor assoc id: nil] .
var N : Nat .
var LN : List-Nat .
---len
op len : List-Nat -> Nat .
eq len(N) = 1 .
eq len(nil) = 0 .
eq len(N,LN) = len(LN) + 1 .
---reverse
op reverse : List-Nat -> List-Nat .