Экзамен по курсу «Формальные спецификации программ. 18.12.2002
Часть I. Язык RSL и тестирование на основе формальных спецификаций»
Задачи и решение
1. Дано explicit определение функции. Написать implicit-спецификацию функции эквивалентной данной.
value
f : Int ><Int >< Int -> write x, y Int >< Int
f(a,b,c) is if a=b then
(if a+b > c then c else x:=y; a+b end,
b*(if c>0 then x:=c; c else 0-c end))
else (y:=a+b; y, a-b) end
Решение
value
f : Int ><Int >< Int -> write x, y Int >< Int
f(a,b,c) as (d, e)
post if a=b then
y=y’ /\ (if a+b > c then d=c else x=y; d=a+b end,
if c>0 then x=c; d=b*c else x=x’ /\ d=0-c end)
else (x=x’ /\ y=a+b /\ d=a+b /\ e=a-b) end
1. Дано explicit определение функции. Написать implicit-спецификацию функции эквивалентной данной.
value
f : Int >< Int -> write x read y Int >< Int >< Int
f (a, b) is
local variable v : Int := 0 in
for i in <.a..b.> do
v := v+2*(x:=i;i)
end; (a,b,v+y)
end
Решение
value
f : Int >< Int -> write x read y Int >< Int >< Int
f (a, b) as (c,d,e)
post if a<b then x=x’ /\ (c,d,e)=(a,b,y)
else x=b /\ (c,d,e)=(a,b,(a+b)*(b-a+1)+y)
end
1. Дано explicit определение функции. Написать implicit-спецификацию функции эквивалентной данной.
value
f : Int ><Int >< Int -> write x, y read z Int >< Int
f(a,b,c) is if a=b then
(if a+b > c then c else x:=y; a+b end,
b*(if c>0 then x:=c; c else 0-c end))
else (y:=a+b; y, a-b) end
Решение
value
f : Int ><Int >< Int -> write x, y read z Int >< Int
f(a,b,c) as (d,e)
post if a=b then
y=y’ /\ (if a+b > c then d=c else x=y; d=a+b end,
if c>0 then x=c; d=b*c else x=x’ /\ d=0-c end)
else (x=x’ /\ y=a+b /\ d=y /\ e=a-b) end
1. Дано explicit определение функции. Написать implicit-спецификацию функции эквивалентной данной.
value
f : Int >< Int -> write x, y read z Int >< Int >< Int
f (a, b) is
local variable v : Int := 0 in
y:= x + z;
for i in <.a..b.> do
v := v+(x:=v;2)*i
end; (a,b,v)
end
Решение
value
f : Int >< Int -> write x, y read z Int >< Int >< Int
f (a, b) as (c,d,e)
post y=x’+z /\ if a<b then x=x’ /\ (c,d,e)=(a,b,0)
else x= (a+b-1)*(b-a) /\ (c,d,e)=(a,b,(a+b)*(b-a+1))
end
2. Дать explicit или implicit определение функций (включая слабейшее предусловие), отвечающих требованиям аксиом:
type S, E value create : Unit -> S, add : E >< S -> S, del : E>< Nat >< S -~-> S, get : E >< S -> Nat,
|
axiom all e : E, s : S :- get( e, create( ) ) is 0,
all e1,e2 : E, s : S :- get ( e1, add (e2, s)) is if e1 = e2 then 1+get( e1, s ) else get( e1, s ) end, all e1, e2 : E, n : Nat, s : S :- del( e1, n, add( e2, s )) is if n=0 then add(e2, s ) elsif e1 = e2 then del( e1, n-1, s ) else add(e2, del( e1, n, s ) ) end |
Решение
- мультимножество
2. Дать явную спецификацию, которая может быть уточнением данной:
type С,A = Nat value create: Unit -> C, add : A >< C -> C,
|
get : C -~-> A >< C axiom all e:A, l:C :- get (add(e,l)) is if (e<0) \/ (l=create()) then (e,l) else let (a,b)=get(l) in (a,add(e,b)) end end |
|
|
Решение
type С-list, A = Nat
value
create: Unit -> C create() is <..>,
add : A >< C -> C
add (a,c) is
if (a<0) then a ^ l
else l ^ a end ,
get : C -~-> A >< C
get (c) is (hd c, tl c)
pre len c > 0
2. Дать explicit или implicit определение функций (включая слабейшие предусловия), отвечающих требованиям аксиом:
type S, E value create : Unit -> S, add2 : S >< E -> S, add3 : E >< S >< E-> S, del : S -~-> S, get : S -~-> E
|
axiom all e1,e2 : E, s : S :- del( add3( e1, s, e2 ) ) is add2(s, e2) , all e : E, s : S :- del(add2(s,e)) is if s=create() then create() else add2(del(s), e) end, all e1,e2 : E, s : S:- get(add3(e1,s,e2)) is e1, all e : E, s : S :- get(add2(s, e)) is if s=create() then e else get (s) end
|
|
|
Решение
add2 реализует очередь, add3 добавляет элемент с двух сторон.
Задача 3-го типа (номер
2)
2. Доказать, что вторая спецификация является (или не является) уточнением первой.
value
f1 : A >< L -~ -> L
f2 : A >< L -~ -> L
f3 : L -> Nat
axiom
all a : A, b : L :-
f3(f1(a,b)) is f3(b)+1
pre f3(b) = 1, -- добавлено предусловие
all a : A, b : L :-
f3(f2(a,b)) is 1+f3(b)
pre f3(b) = 1, -- добавлено предусловие
all a: A, b : L :-
f1(a,b) is f2(a,b)
pre f3(b) = 1
_________________________________________________________________________
type
L = A-list
value
f1 : A >< L -~ -> L
f1(a, b) is <. a .> ^ tl b
pre b ~= <..>,
f2 : A >< L -~ -> L
f2(a, b) is tl b ^ <. a .>
pre b ~= <..>
f3 : L -> Nat
f3(l) is len l
Решение
Доказываем третью аксиому
all a: A, b : L :-
f1(a,b) is f2(a,b)
pre f3(b) = 1
[[раскрыть кантор]]
if f3(b) = 1 then f1(a,b) is f2(a,b) else true end
[[раскрыть f3,f1,f2]]
if len b = 1 then <. a .> ^ tl b is tl b ^ <. a .> else true end
[[вычислить tl при len b = 1]]
if len b = 1 then <. a .> ^ <..> is <..> ^ <. a .> else true end
[[вычислить ^]]
if len b = 1 then <. a .> is <. a .> else true end
[[вычислить is]]
if len b = 1 then true else true end
[[вычислить if]]
true
Ответ – «Да, является уточнением»
3. Упростить выражение
a!(5+a?) || ((x:=(x:=a?;1)) ++ (b!4 || x:=a? || b!6 || a!3 || y:=b?))
Решение
1 - x:=a?;1
a) y:=4
a!(5+a?) || (x:=1 ++ ( x:=a? || b!6 || y:=4))
a!(5+a?) || (x:=1) || x:=a? || b!6 || y:=4
b) y:=6
a!(5+a?) || (x:=1)) ++ (b!4 || x:=a? || y:=6))
a!(5+a?) || x:=1|| b!4 || x:=a? || y:=6
2 - x:=a?
a) y:=4
a!(5+a?) || ((x:=(x:=a?;1)) ++ ( x:=3 || b!6 || y:=4)) -- stop
b) y:=6
a!(5+a?) || ((x:=(x:=a?;1)) ++ (b!4 || x:=3 || y:=6)) -- stop
Всего 4 решения
3. Упростить выражение
(x:=(a? |^| b?)) || ((x:=(if true |^| false then b!1;1 else x:=a?;6 end)) ++ (b!4 || a!3 || y:=b?))
1 – true
(x:=(a? |^| b?)) || ((x:= b!1;1) ++ (b!4 || a!3 || y:=b?))
a) y:= 1
(x:=(a? |^| b?)) || ((x:=1) ++ (b!4 || a!3 || y:=1))
(x:=(a? |^| b?)) || ((x:=1) || (b!4 || a!3 || y:=1))
Result: (x:=3 || b!4 || y:=1 ) |^| (x:=4 || a!3 || y:=1)
b) y:=4
Result: (x:=(a? |^| b?)) || ((x:= b!1;1) ++ ( a!3 || y:=4)) -- stop
2 - false
(x:=(a? |^| b?)) || ((x:=( x:=a?;6)) ++ (b!4 || a!3 || y:=b?))
(x:=(a? |^| b?)) || ((x:=6) ++ (b!4 || y:=b?))
Result: x:=a?|| x:=6 || b!4 || y:=b? -- or y:=4
|^| x:=4 || x:=6 || y:=b?
|^| x:=b? || x:=6 || y:=4
Всего 6 решений
3. Упростить выражение
case (a? |^| b?) of
0,1 -> x:=a?+1,
2 -> x:=b? ,
3 -> y:=a?+3,
4 -> y:=b?+a?,
end || a!(b?) || a!0 || b!(a?+4)
Решение
1 – case a?
a) b!(a?+4)
case a? of
0,1 -> x:=a?+1,
2 -> x:=b? ,
3 -> y:=a?+3,
4 -> y:=b?+a?,
end || a!(b?) || b!4 ----> a!4 ---->
Result: y:=b?+a?
b) case
Result: x:=a?+1 || a!(b?) || b!(a?+4)
2 – case b?
a) a!b?
Result: case b? of
0,1 -> x:=a?+1,
2 -> x:=b? ,
3 -> y:=a?+3,
4 -> y:=b?+a?,
end || a!4
b) case
Result: y:=b?+a?|| a!(b?)
3. Упростить выражение
case (a?) of
0,1 -> x:=a?+1,
2 -> x:=b? |^| a?,
3 -> y:=a?+3,
4 -> y:=b?+a?,
end || a!0 || b!(a?) || (a!2 |^| a!3)
Решение
1 – a!2
a) a!2 -> a?
Result: x:=b? --> x:=0
Result: x:=a? --> x:=0 || b!(a?) |^|
x:=a? || b!0
b) a!0->a?
Result: x:=b? |^| a? --> x:=0 |^|
(x:=b? || a!0)
2 – a!3
a) a!0->b!(a?)
Result: y:=a?+3 --> ( y:=3 || b!( a?)) |^|
(y:=a?+3 || b!0)
b) a!3->b!(a?)
Result: x:=a?+1 --> (x:=4 || b!(a?)) |^|
(x:=a?+1 || b!3)
4. Определить классы эквивалентности в пространстве входных значений функции f, отвечающие разбиению пространства в соответствии с критерием полноты тестового покрытия “все достижимые дизъюнкты”
variable a, b : Int ...
post
if a+b = 5 /\ (b>4)then ...
elsif (a > b) then ...
else ...
end
pre a+b<=6 \/ a-b>3
Решение
|
m1 a+b<=6 |
m2 a-b>3 |
m3 a+b = 5 |
m4 (b>4) |
m5 (a > b) |
a |
b |
|
1 |
true |
|
true |
true |
|
0 |
5 |
|
1 |
false |
true |
true |
true |
|
|
|
|
2 |
true |
|
false |
|
true |
3 |
1 |
|
2 |
false |
true |
true |
false |
true |
|
|
|
2 |
true |
|
true |
false |
true |
3 |
2 |
|
2 |
false |
true |
false |
|
true |
6 |
1 |
|
3 |
true |
|
false |
|
false |
2 |
4 |
|
3 |
false |
true |
true |
false |
false |
|
|
|
3 |
true |
|
true |
false |
false |
2 |
3 |
|
3 |
false |
true |
false |
|
false |
|
|
|
3. Определить классы эквивалентности в пространстве входных значений функции f, отвечающие разбиению пространства в соответствии с критерием полноты тестового покрытия “все достижимые дизъюнкты”
variable a : Int, b : Int –m-> Int
post
if ~((a+1) isin rng b) then ...
elsif (card rng b < card dom b) /\ (b(a) = a) then ...
else ...
end
pre (a isin dom b) \/ b = [ ]
Решение
|
m1 a+1 isin dom b |
m2 b = [ ] |
m3 ~((a+1) isin rng b) |
m4 card rng b < card dom b |
m5 b(a) = a |
A |
b |
|
1 |
true |
|
true |
|
|
1 |
[1+>1] |
|
1 |
false |
true |
true |
|
|
1 |
[] |
|
2 |
true |
|
false |
true |
true |
1 |
[1+>1,2+>1,2+>2] |
|
2 |
false |
true |
false |
true |
true |
|
|
|
3 |
true |
|
false |
false |
|
1 |
[2+>2] |
|
3 |
false |
true |
false |
true |
false |
|
|
|
3 |
true |
|
false |
true |
false |
1 |
[2+>2,3+>2] |
|
3 |
false |
true |
false |
false |
|
|
|
|
4. Определить классы эквивалентности в пространстве входных значений функции f, отвечающие разбиению пространства в соответствии с критерием полноты тестового покрытия “все достижимые дизъюнкты”
variable a, b : Int ...
post
if (b < 4) then ...
elsif (a + b = 5) \/ (b > 4) \/ (a > b) then ...
else ...
end
pre a+b<=6
Решение
|
m1 a+b<=6 |
m2 b<4 |
m3 a+b = 5 |
m4 b>4 |
m5 a > b |
a |
b |
|
1 |
true |
true |
|
|
|
0 |
3 |
|
2 |
true |
false |
true |
|
|
0 |
5 |
|
2 |
true |
false |
false |
true |
|
1 |
5 |
|
2 |
true |
false |
false |
false |
true |
|
|
|
3 |
true |
false |
false |
false |
false |
2 |
4 |
|
3. Определить классы эквивалентности в пространстве входных значений функции f, отвечающие разбиению пространства в соответствии с критерием полноты тестового покрытия “все достижимые дизъюнкты”
variable a : Int, b : Int-list ...
post
if ((a+1) ~isin inds b) then ...
elsif (len b > card elems b) /\ (b(a) = a) then ...
else ...
end
pre (a isin inds b) /\ ( b(a) < 0 )
|
m1 (a isin inds b) |
m2 b(a) < 0 |
m3 ((a+1)~ isin inds b) |
m4 |
m5 b(a) = a |
a |
b |
|
1 |
true |
true |
true |
|
|
1 |
<.0-2.> |
|
2 |
true |
true |
false |
true |
true |
1 |
|
|
3 |
true |
true |
false |
false |
|
1 |
<.0-2, 1.> |
|
3 |
true |
true |
false |
true |
false |
1 |
<.0-2,0-2.> |
|
4. Дано определение вариантного типа:
type Collection == empty | add1 (Collection <-> tail, tail:Collection)
Дать эквивалентное определение без использования вариантных определений.
4. Дано определение вариантного типа:
type Collection == empty | add1 (head:Elem) | add2(head : Elem <->head), Elem
Дать эквивалентное определение без использование вариантных определений