我正在尝试在Scala中为'CSP'实现解析器和语义。我已经实现了解析器,现在我正在忙于语言的语义部分。我对并发系统和非确定性选择的世界都是全新的。所以这是我的问题:
我想按照解释的那样实现“非确定性选择”和“接口并行” here
我现在可以理解这个程序,但是当谈到非决定论时我无法理解。我需要一个好的数据类型来在Scala中实现它,我想将所有进程放在一个列表中然后随机化列表然后从修改列表中选择一个元素。但这对我来说听起来不那么不确定。
之前有没有人遇到过这个问题并且知道一个好的算法?
答案 0 :(得分:1)
我对CSP的理解非常有限,因为CSP运算符对应于以下Haskell类型:
-- Prefixing corresponds to functions
x :: A
P :: B
x -> P :: A -> C
-- Choice corresponds to product
P :: A
Q :: B
P □ Q :: (A, B)
-- Non-determinism corresponds to sum
-- I don't know how to make the non-determinism symbol, so I use (△)
P :: A
Q :: B
(P △ B) :: Either A B
然后你可以使用代数同构来减少CSP表达式。使用维基百科示例:
(coin -> STOP) □ (card -> STOP)
-- translates to the following Haskell type:
(coin -> Stop, card Stop)
-- which is algebraically isomorphic to:
(Either coin card -> Stop)
-- translates in reverse back to CSP:
coin □ card -> STOP
另外,我认为维基百科的一个例子是错的(或者我错了)。我相信这个表达应该减少到:
(a -> a -> STOP) □ (a -> b -> STOP)
-- translates to the following Haskell type:
(a -> a -> STOP, a -> b -> STOP)
-- which is algebraically isomorphic to:
a -> Either a b -> STOP
-- translates in reverse back to CSP:
a -> (a △ b) -> STOP
但是,我仍然没有想出相应的接口并行。它似乎与优雅的概念不符。
答案 1 :(得分:1)
这是一个高级主题。解析方面很容易。编写正确的并发原语非常很难,并且几乎肯定需要使用诸如FDR之类的工具进行形式验证。
如果您只对编写表达式解析器部分而不是编写并发原语感兴趣,那么您可能更愿意在JCSP上构建,{{3}}已经在Java API中提供了这些原语。这个(UKC)的作者使用形式验证来验证其组件,特别是通道和替代(选择)部件。