我一直在尝试将我创建的一段 Prolog 代码转换为 DCG 来表示一个基本的有限自动机。基本上它确保一个可接受的输入是一个 0 和 1 字符串中倒数第三个元素是 1 的输入。
例如[1,0,0,1,0,1]
是可以接受的,而[1,0,1,0,0,0]
不是。
accept(L) :- steps(q0,L,F), final(F).
steps(Q,[],Q).
steps(Q,[H|T],Q2) :- tran(Q,H,Qn), steps(Qn,T,Q2).
final(q1).
tran(Y,0,n0) :- Y = q0; Y = q1; Y = n0.
tran(Y,1,n1) :- Y = q0; Y = q1; Y = n0.
tran(n1,X,h1):- X = 0 ; X = 1.
tran(h1,X,q1):- X = 0 ; X = 1.
Run Code Online (Sandbox Code Playgroud)
我的问题本质上是步骤谓词的第二个子句,其中“tran(Q,H,Qn)”的输出用作步骤(Qn,T,Q2)的输入,在这种情况下是变量Qn。
我想出的 DCG 如下:
accept(L) --> final(F),{F = steps(q,L)}.
steps(Q,[]) --> [Q].
steps(Q,[H|T]) --> steps(E,T), {E …
Run Code Online (Sandbox Code Playgroud)