什么 - >在prolog中意味着什么?

per*_*fan 5 prolog dcg

-->Prolog的意思是什么?

你能提供一个具体的例子并解释它是如何工作的吗?

小智 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\n

Pereira, FCN 和 Warren, DHD (1980):
\n用于语言分析的定子句语法 \xe2\x80\x93
\n形式主义调查及与
\n增强转换网络的比较,北荷兰
\n出版公司,人工智能,13 , 231 \xe2\x80\x93 278

\n\n

http://cgi.di.uoa.gr/~takis/pereira-warren.pdf

\n