小智 5
Hardmath已经解释了很多。但 DCG 更令人着迷的是,尽管 -->/2 语法建议上下文无关语法,但实际上它的意义更多。由于属性,我们还可以对更复杂的语言进行建模,属性只是非终结符的参数。
\n\n这是一个生成并接受语言 L = {a^nb^nc^n} 的 DCG。DCG 内容如下:
\n\n:- use_module(library(clpfd)).\n\nstart(N) --> as(N), bs(N), cs(N).\n\nas(N) --> {N #> 0, M #= N-1}, [a], as(M).\nas(0) --> [].\n\nbs(N) --> {N #> 0, M #= N-1}, [b], bs(M).\nbs(0) --> [].\n\ncs(N) --> {N #> 0, M #= N-1}, [c], cs(M).\ncs(0) --> [].\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的代码使用了所谓的辅助条件(*),由{}包含,这是散布在DCG中的正常代码。为了允许双向使用 DCG,我们使用 CLP(FD) 而不是普通算术。以下是 SWI-Prolog 中运行的一些示例:
\n\n?- phrase(start(X),[a,a,a,b,b,b,c,c,c]).\nX = 3 \n?- phrase(start(3),Y).\nY = [a,a,a,b,b,b,c,c,c]\n
Run Code Online (Sandbox Code Playgroud)\n\n但在实践中,DCG 也经常被发现,因为它们能够传递状态。它们允许 Prolog 中存在某种形式的 monad。只需将输入列表和输出列表替换为输入状态和输出状态即可。
\n\n再见
\n\n(*)\n早期推广 DCG 的论文是:
\n\nPereira, FCN 和 Warren, DHD (1980):
\n用于语言分析的定子句语法 \xe2\x80\x93
\n形式主义调查及与
\n增强转换网络的比较,北荷兰
\n出版公司,人工智能,13 , 231 \xe2\x80\x93 278
http://cgi.di.uoa.gr/~takis/pereira-warren.pdf
\n