Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 方程式来自;“编程珍珠”谁能给我解释一下吗?_Algorithm_Haskell_Functional Programming_Finite Automata - Fatal编程技术网

Algorithm 方程式来自;“编程珍珠”谁能给我解释一下吗?

Algorithm 方程式来自;“编程珍珠”谁能给我解释一下吗?,algorithm,haskell,functional-programming,finite-automata,Algorithm,Haskell,Functional Programming,Finite Automata,朋友们,我觉得我被卡住了。有人能给我解释一下从“函数算法设计的珍珠”第11章(“不是最大段和”)中挑选方程吗 这就是问题所在(有点简化) 让我们来看一些具有给定转换的状态: data State = E | S | M | N deriving (Show, Eq) step E False = E step E True = S step S False = M step S True = S step M False = M step M Tr

朋友们,我觉得我被卡住了。有人能给我解释一下从“函数算法设计的珍珠”第11章(“不是最大段和”)中挑选方程吗

这就是问题所在(有点简化) 让我们来看一些具有给定转换的状态:

data State = E | S | M | N 
                deriving (Show, Eq) 

step E False = E 
step E True = S 
step S False = M 
step S True = S 
step M False = M 
step M True = N 
step N False = N 
step N True = N 
现在,让我们定义“拾取”:

 pick q = map snd . filter ((== q) . fst) . map (\a -> (foldl step E a, a))
作者声称以下七个方程式成立:

pick E xs = [[]]
pick S [ ] = [ ]
pick S (xs ++ [x]) = map (++[x ]) (pick S xs ++ pick E xs)
pick M [ ] = [ ]
pick M (xs ++ [x ]) = pick M xs ++ pick S xs
pick N [ ] = [ ]
pick N (xs ++ [x]) = pick N xs ++ map (++[x]) (pick N xs ++ pick M xs)

谁能简单地解释一下,为什么这些方程是真的,我们怎么能证明一个明显的证据?我感觉我几乎能理解S方程,但总的来说这仍然是难以捉摸的。

好的,我需要可视化你的状态图:

并为
pick::State->[[Bool]]->[(State[Bool])
提供类型签名

现在,这与您的第一个等式不一致了
选择E xs=[[]]
-它必须是
选择E xs=[(E,[]]]

也许您的意思是这样定义
pick

pick :: State -> [[Bool]] -> [[Bool]]
pick q = map snd . filter ((== q) . fst) . map (\a -> (foldl step E a, a))
假设这个定义,第一个等式现在是有意义的。它声称如果你从
E
开始,那么
xs
中唯一以
E
结尾的布尔序列就是空列表

请注意,这假定
[]
∈ <代码>xs

另外,如果
ys=replicate n False
选择E[ys]=[ys]
,这意味着∀ <代码>n,
ys
∉ <代码>xs

第二个、第四个和第六个方程的形式都是
pick_[]=[]
,这在
map
filter
的定义中非常正确

第三个等式,
pick S(xs++[x])=map(+[x])(pick S xs++pick E xs)
也没有什么意义。我猜它想说的是:

pick S (map (++[True] xs) = map (++[True]) (pick S xs ++ pick E xs)
这就是说,任何从
E
开始并在
S
结束的路径都可以通过将现有路径带到
E
S
并附加
True
来构造。同样,每个在
S
结束的路径都必须以
True
结束

第五个等式同样是荒谬的,应该表述为:

pick S (map (++[False] xs) = map (++[False]) (pick S xs ++ pick M xs)
pick N (map (++ [True]) xs) = pick N xs ++ map (++[True]) (pick N xs ++ pick M xs)
第七个等式应重新表述为:

pick S (map (++[False] xs) = map (++[False]) (pick S xs ++ pick M xs)
pick N (map (++ [True]) xs) = pick N xs ++ map (++[True]) (pick N xs ++ pick M xs)

“如果你从E开始,xs中唯一以E结尾的布尔序列就是空列表。”但是,
False
s的序列不也以E结尾吗?哦,好吧,详细答案是+1。我猜是“简化”问题书中的一部分代码引入了很多错误,因为我认为这样的东西不可能在一本严肃的书中发表。@interjay,唉,事实并非如此,书中的方程式正是这种形式。