小编Kis*_*thu的帖子

在 Prolog 中使用 DCG 时,有没有办法递归调用非终结符?

我一直在尝试将我创建的一段 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)

prolog dcg

3
推荐指数
1
解决办法
89
查看次数

标签 统计

dcg ×1

prolog ×1