PROLOG 一个特定的有限状态自动机
PROLOG a particular finite-state-automaton
我找不到以下问题的答案。自动机接受像 "A:5739." 或 "C::39942)" 这样的字符串,这些让我想起了文件系统的路径,但我不确定。
问题文本:
Consider the following finite-state automaton written in Prolog.
What seems to recognize?
Assume having the predicate
alphanumeric/1
which is true when its argument is a letter or digit.
Automaton:
accept([I | Is], S) :- delta(S, I, N), accept(Is, N).
accept([], Q) :- final(Q).
initial(start).
final(type).
delta(start, 'A', dev).
delta(start, 'B', dev).
delta(start, 'C', dev).
...
delta(start, 'Z', dev).
delta(dev, ':', n1).
delta(n1, '\', dev).
delta(n1, L, name) :- alphanumeric(L).
delta(name, L, name) :- alphanumeric(L).
delta(name, '\', name).
delta(name, '.', type).
delta(name, L, type) :- alphanumeric(L).
好吧,前两个子句就是如何始终执行 NDFA:每次我们查找列表中的下一个字符,并通过 delta/3
谓词传递它以获得新状态,直到我们到达序列结束,之后我们可以验证状态是否为接受状态。
接下来我们看到start
是初始状态,type
是唯一的接受状态
程序的其余部分描述了 delta/3
转换。我们可以将其可视化,例如使用 GraphViz:
digraph finite_state_machine {
rankdir=LR;
size="8,5"
node [shape = doublecircle]; type;
node [shape = circle] start, dev, n1;
node [shape = circle, label="name"] nam;
start -> dev [ label = "[A-Z]" ];
dev -> n1 [ label = ":" ];
n1 -> dev [ label = "\" ];
n1 -> nam [ label = "[A-Za-z0-9]" ];
nam -> nam [ label = "[A-Za-z0-9\]" ];
nam -> type [ label = "[A-Za-z0-9.]" ];
}
这会生成以下图像:
根据这张图,我们看到它接受的语言(正则表达式):
[A-Z]:(\:)*[A-Za-z0-9][A-Za-z0-9\]*[A-Za-z0-9.]
因此它接受以字符 A-Z 开头,后跟冒号 (:
) 后跟零个或多个反斜杠冒号 (:\
) 后跟字母数字字符后跟零的字符串单词组 [A-Za-z0-9\.]
中的一个或多个字符后跟至少一个字母数字字符。
例如:
X:\:0Azz0qdqd012QcCQCA
D:\:QA
B:\:\:QT
C:QWR.
C:\:a\q\b\QWR.
C:tempdir\bla\qux.
C:tempdir\bla\.
C:.
它只能包含一个点作为最后一个字符。此外,反斜杠不能是最后一个字符。它是一种基本的文件路径语言,尽管有一些重构。
我找不到以下问题的答案。自动机接受像 "A:5739." 或 "C::39942)" 这样的字符串,这些让我想起了文件系统的路径,但我不确定。
问题文本:
Consider the following finite-state automaton written in Prolog. What seems to recognize?
Assume having the predicate
alphanumeric/1
which is true when its argument is a letter or digit.
Automaton:
accept([I | Is], S) :- delta(S, I, N), accept(Is, N). accept([], Q) :- final(Q). initial(start). final(type). delta(start, 'A', dev). delta(start, 'B', dev). delta(start, 'C', dev). ... delta(start, 'Z', dev). delta(dev, ':', n1). delta(n1, '\', dev). delta(n1, L, name) :- alphanumeric(L). delta(name, L, name) :- alphanumeric(L). delta(name, '\', name). delta(name, '.', type). delta(name, L, type) :- alphanumeric(L).
好吧,前两个子句就是如何始终执行 NDFA:每次我们查找列表中的下一个字符,并通过 delta/3
谓词传递它以获得新状态,直到我们到达序列结束,之后我们可以验证状态是否为接受状态。
接下来我们看到start
是初始状态,type
是唯一的接受状态
程序的其余部分描述了 delta/3
转换。我们可以将其可视化,例如使用 GraphViz:
digraph finite_state_machine {
rankdir=LR;
size="8,5"
node [shape = doublecircle]; type;
node [shape = circle] start, dev, n1;
node [shape = circle, label="name"] nam;
start -> dev [ label = "[A-Z]" ];
dev -> n1 [ label = ":" ];
n1 -> dev [ label = "\" ];
n1 -> nam [ label = "[A-Za-z0-9]" ];
nam -> nam [ label = "[A-Za-z0-9\]" ];
nam -> type [ label = "[A-Za-z0-9.]" ];
}
这会生成以下图像:
根据这张图,我们看到它接受的语言(正则表达式):
[A-Z]:(\:)*[A-Za-z0-9][A-Za-z0-9\]*[A-Za-z0-9.]
因此它接受以字符 A-Z 开头,后跟冒号 (:
) 后跟零个或多个反斜杠冒号 (:\
) 后跟字母数字字符后跟零的字符串单词组 [A-Za-z0-9\.]
中的一个或多个字符后跟至少一个字母数字字符。
例如:
X:\:0Azz0qdqd012QcCQCA
D:\:QA
B:\:\:QT
C:QWR.
C:\:a\q\b\QWR.
C:tempdir\bla\qux.
C:tempdir\bla\.
C:.
它只能包含一个点作为最后一个字符。此外,反斜杠不能是最后一个字符。它是一种基本的文件路径语言,尽管有一些重构。