【问题标题】:accepting/rejecting Pushdown automata in haskell在haskell中接受/拒绝下推自动机
【发布时间】:2019-04-20 14:53:36
【问题描述】:

我正在尝试在 Haskell 中创建一个下推自动机检查。基本上,一个接受(start_state, final_state, set_of_rules) and a string 的函数。如果此 PDA 接受该字符串,则它应该返回 Accepted,否则返回 Rejected

这是我目前所拥有的:

type Transition = ((Int,String,String),(Int,String))

type Configuration = (Int,String,String)

type PDA = (Int,[Int],[Transition])

data Result = Accept | Reject | Jj deriving Show

run :: PDA -> String -> [Result]
run (ss,fs,tr) xs = runs (ss,fs,tr) (ss,xs,"")

runs :: PDA -> Configuration -> [Result]
-- When string and stack empty accept
runs _ (_,[],[]) = [Accept]
-- If string empty and stack not empty, reject
runs _ (_,[],_) = [Reject]
runs z@(ss,fs,tt) (cs,(x:xs),st) = [runs z (d,xs,e) | m@((a,b,c),(d,e)) <- [xf | xf@((a,b,c),(d,e)) <- tt, a == cs, b == [x]]]

最后一行是我的逻辑中断的地方,我想稍微解释一下:

[xf | xf@((a,b,c),(d,e)) <- tt, a == cs, b == [x]]

这需要一组规则 (tt) 并列出我可能在当前状态 (cs) 和字符串头部匹配的地方使用的所有规则。这完美地工作并列出了所有可能的动作。我想获取此列表中的每个元素并再次通过此函数运行它。当我达到我的基本情况时,我会根据堆栈状态返回 Accept 或 Reject。

我希望看到的是一个充满Reject 的列表,因为我还没有真正使用堆栈。

我一直收到Couldn't match type ‘[Result]’ with ‘Result’ 编译错误,但我无法修复它。非常感谢任何帮助

【问题讨论】:

    标签: haskell recursion pushdown-automaton


    【解决方案1】:

    问题是在递归子句中:

    runs :: PDA -> Configuration -> [Result]
    -- ...
    runs z@(ss,fs,tt) (cs,(x:xs),st) = [runs z (d,xs,e) | ... ]

    您违反了类型合同。实际上runs 应该返回Results 的列表。但是在您的表达式中,您构建了runs 的结果列表(以及runs z (d, xs, e) 的列表,因此这意味着此列表理解正在构建Results 的列表列表,而不是结果列表。

    因此,我们需要将这些子列表“连接”成一个平面列表,例如 concat :: [[a]] -&gt; [a],其中:

    runs :: PDA -> Configuration -> [Result]
    -- When string and stack empty accept
    runs _ (_,[],[]) = [Accept]
    -- If string empty and stack not empty, reject
    runs _ (_,[],_) = [Reject]
    runs z@(ss,fs,tt) (cs,(x:xs),st) = concat [runs z (d,xs,e) | m@((a,b,c),(d,e)) <- [xf | xf@((a,b,c),(d,e)) <- tt, a == cs, b == [x]]]

    【讨论】:

    • 非常感谢威廉,你甚至不知道我被困了多久。如果我正确使用堆栈,我可以和你确认一下这个逻辑是否有效吗?
    • @RomanProcházkaJr.:如果您正确生成了runs 列表(这里有点神秘),它应该可以工作。但有可能在runs 中仍然存在一些问题。比如a == cs等就有点“神秘”了。
    • 有没有更好的方法可以推荐?
    • @RomanProcházkaJr.:可能值得使用记录语法,这样可以更明确地使用哪些属性以及如何使用。 learnyouahaskell.com/…
    猜你喜欢
    • 2020-08-06
    • 2020-05-16
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多