Изменения

Перейти к: навигация, поиск

Лямбда-исчисление

395 байт убрано, 21:40, 6 декабря 2012
Нет описания правки
Для работы со списками чисел нам понадобятся следующие функции:
* <tex>\operatorname{empty}</tex> {{---}} возвращает пустой список* <tex>\operatorname{cons}</tex> {{---}} принимает первый элемент и оставшийся список, склеивает их* <tex>\operatorname{head}</tex> {{---}} вернуть голову списка* <tex>\operatorname{tail}</tex> {{---}} вернуть хвост списка
Список будем хранить в следующем виде: <tex>\langle len, p_1^{a_1}p_2^{a_2}\ldots p_{len}^{a_{len}} \rangle</tex>. При этом, голова списка будет храниться как показатель степени при <tex>p_{len}</tex>.
<tex>\operatorname{cons} = \lambda h \to \lambda t \to \operatorname{pair}\ (\operatorname{succ}\ (\operatorname{fst}\ t))\ (\operatorname{mult}\ (\operatorname{snd}\ t)\ (\operatorname{power}\ (\operatorname{ithPrime}\ (\operatorname{fst}\ t))\ h))</tex>
<tex>\operatorname{head } = Lam "\lambda list" $ \to \operatorname{getExponent `App` }\ (\operatorname{snd'' `App` Var "}\ list") `App` \ (\operatorname{ithPrime `App` }\ (\operatorname{pred' `App` }\ (\operatorname{fst'' `App` Var "}\ list")))</tex>
<tex>\operatorname{tail } = Lam "\lambda list" $ \to \operatorname{pair' `App` }\ (\operatorname{pred' `App` }\ (\operatorname{fst'' `App` Var "}\ list")) `App` (\operatorname{eliminateMultiplier `App` }\ (\operatorname{snd'' `App` Var "}\ list") `App` \ (\operatorname{ithPrime `App` }\ (\operatorname{pred' `App` }\ (\operatorname{fst'' `App` Var "}\ list" ))) )</tex>
<tex>\operatorname{eliminateMultiplier' } = Lam "\lambda f" $ Lam "\to \lambda n" $ Lam "\to \lambda m" $ \to \operatorname{if'' `App` }\ (\operatorname{isZero' `App` }\ (\operatorname{mod' `App` Var "}\ n" `App` Var "\ m"\)) `App` \ (Var "f" `App` \ (\operatorname{div' `App` Var "}\ n" `App` Var "\ m") `App` Var "\ m") `App` Var "\ n"eliminateMultiplier = fix' `App` eliminateMultiplier'</tex>
getExponent' = Lam "f" $ Lam "n" $ Lam "m" $ if'' `App` (isZero' `App` (mod' `App` Var "n" `App` Var "m")) `App` (succ' `App`(Var "f" `App` (div' `App` Var "n" `App` Var "m") `App` Var "m")) `App` zero'getExponent <tex>\operatorname{eliminateMultiplier} = \operatorname{fix' `App` getExponent'}\ \endoperatorname{codeeliminateMultiplier'}</tex>
На основе этого всего уже можно реализовать эмулятор машины тьюринга:с помощью пар, списков чисел можно хранить состояния. С помощью рекурсии можнообрабатывать переходы. Входная строка будет даваться, например, закодированнойаналогично списку: пара из длины и числа, характеризующего список степенями простых. Я бы продолжил это писать, но уже на операции $head [1, 2]$ я не дождался окончания выполнения. Скорость лямбда-исчисления как вычислителяпечальна. <tex>\operatorname{getExponent'} = \lambda f \to \lambda n \to \lambda m \to \operatorname{if}\ (\operatorname{isZero}\ (\operatorname{mod}\ n\ m\))\ (\operatorname{succ}\ (f\ (\operatorname{div}\ n\ m)\ m))\ \bar 0</tex>
<tex>\ignoreoperatorname{getExponent} = \operatorname{fix}\ \beginoperatorname{codegetExponent'}</tex>
four' = norm $ succ' `App` three'five' = norm $ succ' `App` four'=Выводы===
list2 = norm $ cons `App` one' `App` emptylist32 = cons `App` zero' `App` list2На основе этого всего уже можно реализовать эмулятор машины тьюринга: с помощью пар, списков чисел можно хранить состояния. С помощью рекурсии можно обрабатывать переходы. Входная строка будет даваться, например, закодированной аналогично списку: пара из длины и числа, характеризующего список степенями простых. Я бы продолжил это писать, но уже на операции <tex>\operatorname{head} [1, 2]</tex> я не дождался окончания выполнения. Скорость лямбда-исчисления как вычислителя печальна.
normFiveFact = normIO 0 $ fact' `App` five' -- fiftysix = mult twentyeight two-- fiftyfive = pred fiftysix-- six = pred seven --main = do print $ fiftysix (+1) 0main = do -- f <- normIO 0 $ ithPrime `App` three' -- f <- normIO 0 $ getExponent `App` (norm $ plus' `App` four' `App` four') `App` two' f <- normIO 0 $ head `App` (tail `App` list32) print $ toInt f\end{code}} \end{document}[Тут можно это всё потыкать|http://rain.ifmo.ru/~komarov/Turing.lhs]
403
правки

Навигация