Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[29]

fun transfer(from, to, spare, 1) = move disk(from, to, spare) I transfer(from, to, spare, n) =

let val (fl,sl,tl) = transfer(from,spare,to,n-1) val (f2,t2,s2) = move disk(fl.tl.sl) val (s3,t3,f3) = transfer(s2,t2,f2,n-l) in (f3,t3,s3) end

fun tower of hanoi(n) =

transfer(("A", incl(l.n)), ("B", []), ("С", []), n)

Ответ 2.7.1:

fun samefrontier(empty.empty) = true I samefrontier(leaf x, leaf y) = x=y I samefrontier(node(empty,tl),node(empty,t2)) =

samefrontier(tl,t2) I samefrontier(node(leaf x,tl), node(leaf y,t2)) =

x=y andalso samefrontier(tl,t2) I samefrontier(tl as node , t2 as node ) =

samefrontier(adjust tl, adjust t2) I samefrontier( , ) = false and adjust(x as node(empty, )) = x I adjust(x as node(leaf , )) = x I adjust(node(node(tl,t2),t3)) =

adjust(node(tl,node(t2,t3)))

Приведем и другое решение, использующее исключения (см. раздел 2.8):

fun sameftrontier(treel,tree2) = let

exception samefringe : unit fun check el(empty.empty,rest t2) = rest t2 I check el(leaf x, leaf y, rest t2 ) =

if x=y then rest t2 else raise samefringe I check el(el,node(l,r), rest t2) =

check el(el, 1, r::rest t2) I check el( , , ) = raise samefringe fun check( , []) =

raise samefringe I check(empty,tree2) =

check el(empty, hd tree2, tl tree2)


I check(l as leaf(el),tree2) =

check el(l, hd tree2, tl tree2) I check(node(tl,t2),tree2) = check(t2, check(tl,tree2))

null (check(treel,[tree2])) handle samefringe => false end

Ответ 2.7.2:

abstype a set = set of a list with

val emptyset = set [] fun singleton e = set [] fun union(set 11, set 12) = set (11 @ 12) fun member(e, set []) = false I member(e, set(h::t)) =

(e=h) orelse member(e, set t) fun intersection(set [], s2) = set [] I intersection(set(h::t), s2) = let val tset as (set tl) =

intersection(set t, s2) in if member(h,s2) then set(h::tl) else tset end

Ответ 2.7.3:

abstype a set = set of (a list *

{eq : a*a->bool, It : a*a->bool})

fun emptyset ops = set([],ops) fun singleton(e,ops) = set([e],ops) fun member(e,set(1,{eq.lt}) = let fun find [] = false

I find(h::t) = if eq(e,h) then true

else if lt(e,h) then false else find(t)

in find 1 end fun union(set(lst, ops as {eq.lt}), set(lst, )) = let fun merge([], 1st) = 1st I merge(1st,[] ) = 1st

I merge(11 as (hl::tl), 12 as (h2::t2)) =

if eq(hl,h2) then hi::merge(tl,t2) else if lt(hl,h2) then hi::merge(tl,t2) else h2::merge(tl,t2)


in set(merge(1st ,1st),ops) end fun intersect(set(1st, ops as {eq.lt}), set(lst, )) = let fun inter([],lst) = [] I inter (1st, []) = []

I inter(ll as (hl::tl), 12 as (h2::t2)) = if eq(hl,h2) then hi::inter(tl,t2) else if lt(hl,h2) then inter(tl,12) else merge(11,t2) in set(inter(1st,1st), ops) end

end Ответ 2.8.1:

1.Исключение, привязанное к Ехп вне let, отличается от привязанного к Ехп внутри let. Поэтому исключение, возникающее в процессе вычисления f (200) (имеющее целочисленный параметр 200), может быть обработано только обработчиком исключений внутри let - и не может быть обработано внешним обработчиком (который, к тому же, ожидает параметра типа bool). В результате сообщение о возникновении необработанного исключения будет выдано на верхнем уровне диалога. Ситуация не изменится и в том случае, если внешнее исключение будет объявлено как получающее параметр типа int - оба исключения по-прежнему останутся различными.

2.Если при вычислении f(v) окажется, что p(v) ложно, а q(v) истинно, то будет рекурсивно вызвана функция f с параметром b(v). Далее, еслир(Ь(у)) nq(b(v)) окажутся ложными, будет выработано исключение Ехп. Но это исключение не будет обработано приведенным в примере обработчиком, поскольку указанное в нем исключение Ехп есть конструктор, созданный при вычислении f(v) - а выработанное Ехп есть конструктор, созданный при вычислении f (b(v)) - и это две разные вещи. (Еще раз обращаем внимание на то, что все ообъявления внутри объявления функции исполняются каждый раз при рекурсивном вызове, и при этом выполняется новая привязка идентификаторов).

Ответ 2.8.2:

fun threat((х::int,у), (х,у)) = (х=х) orelse (у=у) orelse (х+у=х+у)



[стр.Начало] [стр.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]