私はUdacityで "プログラミング言語"を守り、Haskellで問題集合を表現しようとしています。回答がPythonで書かれている:ハスケルの非決定論的有限状態機械シミュレータを表現する
edges = {(1,"a") : [2,3]
,(2,"a") : [2]
,(3,"b") : [3,4]
,(4,"c") : [5]}
accepting = [2,5]
def nfsmSim(string, current, edges, accepting):
if string == "":
return current in accepting
else:
letter = string[0]
key = (current, letter)
if key in edges:
rest = string[1:]
states = edges[key]
for state in states:
if nfsmSim(rest, state, edges, accepting):
return True
return False
開始状態は常に即ちcurrent = 1
第一の状態です。このよう"aaa"
やなど
文字列は"abb"
または"aabc"
ながら、承認または拒否されています。
書き換えでの私の試み使用ハスケル:
nfsmSim [] c _ = [c]
nfsmSim xs c es = [concat $ nfsmSim (tail xs) s es | (k,ss) <- es, s <- ss, x <- xs, k==(c,x)]
私は入力文字列の末尾に最後の状態を表す整数のリストを返すようにしたいし、その後filter
これらの受理状態に対してとにany
を使用最終的にTrue
またはFalse
を取得してください。
これはおそらく、これを行うためのHaskellの方法ではないこと、そしておそらくより良いwholemeal
解決策があることを認識しています。しかし、初心者としては、私はモンダディックメカニズムと、おそらくこの問題の再帰的な性質に苦しんでいます。
リストの理解ではなく、do
の表記を使用して正しい方向に向けるようにしてください。
あなたは、運動へのリンクを追加してもらえますか? – Zeta
@Zeta [プログラミング言語](https://www.udacity.com/course/programming-languages--cs262) – potong