adp-multi-0.2.0: tests/ADP/Tests/NussinovExample.hs
module ADP.Tests.NussinovExample where
import ADP.Multi.All
import ADP.Multi.Rewriting.All
type Nussinov_Algebra alphabet answer = (
EPS -> answer, -- nil
alphabet -> answer, -- base
alphabet -> answer -> answer, -- left
answer -> answer -> answer, -- right
alphabet -> answer -> alphabet -> answer, -- pair
answer -> answer -> answer, -- split
[answer] -> [answer] -- h
)
pairmax :: Nussinov_Algebra Char Int
pairmax = (nil,base,left,right,pair,split,h) where
nil _ = 0
base _ = undefined
left _ x = x
right x _ = x
pair _ x _ = x + 1
split x y = x + y
h xs = [maximum xs]
nussinov78 :: Nussinov_Algebra Char answer -> String -> [answer]
nussinov78 algebra inp =
let
(nil,base,left,right,pair,split,h) = algebra
s = tabulated $
yieldSize1 (0, Nothing) $
nil <<< EPS >>> id1 |||
right <<< s ~~~ b >>> id1 |||
split <<< s ~~~ t >>> id1
... h
t = tabulated $
pair <<< 'a' ~~~ s ~~~ 'u' >>> id1 |||
pair <<< 'u' ~~~ s ~~~ 'a' >>> id1 |||
pair <<< 'c' ~~~ s ~~~ 'g' >>> id1 |||
pair <<< 'g' ~~~ s ~~~ 'c' >>> id1 |||
pair <<< 'g' ~~~ s ~~~ 'u' >>> id1 |||
pair <<< 'u' ~~~ s ~~~ 'g' >>> id1
b = tabulated $
base <<< 'a' >>> id1 |||
base <<< 'u' >>> id1 |||
base <<< 'c' >>> id1 |||
base <<< 'g' >>> id1
z = mk inp
tabulated = table1 z
in axiom z s