Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MakeevGA-Haskell-a4-shortcode_2014_05_31.doc
Скачиваний:
15
Добавлен:
19.01.2023
Размер:
1.79 Mб
Скачать

Решение для тех, кто не хочет разбираться сам

Приведем здесь наше новое решение целиком, для тех, кому просто интересно, как оно может выглядеть:

module Boat where

import List

-- объект

data Item = Wolf | Goat | Cabbage

deriving (Show, Eq, Ord)

-- положение: где человек-лодка +

-- кто на левом берегу +

-- кто на правом + лог истории

data Position =

L [Item] [Item] String | R [Item] [Item] String

deriving Show

-- два положения одинаковые,

-- если все одинаковое, кроме лога

instance Eq Position where

(==) (L l1 r1 _) (L l2 r2 _) =

l1 == l2 && r1 == r2

(==) (R l1 r1 _) (R l2 r2 _) =

l1 == l2 && r1 == r2

_ == _ = False

-- начальная и целевая позиция

startPosition = L [Wolf, Goat, Cabbage] [] ""

goalPosition = R [] [Wolf, Goat, Cabbage] ""

-- неправильная компания

wrongCompany c =

null ([Goat, Cabbage] \\ c) ||

null ([Goat, Wolf] \\ c)

-- неправильная позиция: без контроля человека остается плохая компания

wrongPosition (L left right _) = wrongCompany right

wrongPosition (R left right _) = wrongCompany left

-- шаг переправы с берега на берег с кем-нибудь: какие варианты можно получить

step (L left right hist) =

[R left right (hist++"Move Right ")] ++

[R (left \\ [who]) (sort $ who:right)

(hist++"Take "++show who++" Right ")

| who <- left]

step (R left right hist) =

[L left right (hist++"Move Left ")] ++

[L (sort $ who:left) (right \\ [who])

(hist++"Take "++show who++" Left ")

| who <- right]

-- очередь поиска

queue old [] = old

queue old (p:ps) =

queue (p:old) (nub $ ps ++ candidates) where

candidates = filter (not.wrongPosition)

(step p) \\ old

-- запускаем поиск по очереди и находим в нем решение

solution = head $

dropWhile (/= goalPosition) $

queue [] [startPosition]

Кто дочитал до этого места и знает, чему равен xyz, может обращаться ко мне за призом. Всего хорошего!

Задачник

Приведенный ниже задачник построен в форме пяти лабораторных работ, каждая из которых объединяет набор заданий на написание функций, объединенных общей тематикой. Подразумевается, что задачи будут выполняться друг за другом параллельно изучению теоретической части – или сразу после ее изучения.

Пояснения и обозначения

Как правило, в большинстве заданий приведены названия уже существующих стандартных функций. Требуется запросить в интерпретаторе тип функций, создать примеры входных данных для них и убедиться, что функции работают именно так, как вы представляете. В заданиях второго типа требуется написать замену стандартной функции, или же написать функцию, аналогичной которой нет среди стандартных. Такие функции лучше писать с постфиксом My, чтобы имена их не пересекались со стандартными, например, headMy. После написания такой функции, заменяющей стандартную, можно в дальнейшем пользоваться стандартной.

В большинстве случаев, приводимые имена функций совпадают со стандартными именами функций, делающих то же самое в стандартных модулях. Для функций с постфиксом My не имеется стандартных аналогов.

Вот таким шрифтом обозначаются куски кода, имена функций и сигнатуры типа.

Вот таким образом оформлены дополнительные задания, выполнять которые необходимо только тем, кто хочет научиться чуть большему, чем остальные. Остальные могут их пропускать.