gpt4 book ai didi

prolog - 自定义 DCG 运算符

转载 作者:行者123 更新时间:2023-12-05 00:47:36 27 4
gpt4 key购买 nike

假设我想编写一个自定义运算符,用于以重复的方式编写 DCG 规则。

例如,假设我有一个 DCG,ws使得:

ws --> [].
ws --> " ", ws.

匹配零个或多个空格。显然,如果我想在我的语法中的每个标记之间使用可选的空格,那么必须放置 , ws 是令人讨厌的。到处。

我可以定义一个新的运算符来替换 ,/2 .
:- op(1000, xfy, [ -- ]).
:- meta_predicate --(*,*,?,?).
--(L,R) --> ({callable(L)} -> call(L); L), ws, ({callable(R)} -> call(R); R).

这加入了 --/2的左右手通过可选的空白规则。这大部分工作正常,但某些事情会绊倒它:
rule --> "foo" -- ("bar"; "quux").

如果我尝试执行此规则,则会收到错误消息 ;/4没有定义。我对这里的问题有一个模糊的概念,但基本上问题是:是否有一种方法可以为 DCG 定义新的操作符,这些操作符的通用性与 ,/2 相同。 ?

最佳答案

, 这个有可能。

目前,主要问题是:

?- 可调用(“foo”)。
真的。

所以,我建议这个更简单的定义:

--(L, R) --> L, ws, R.

另外,我建议:

:- set_prolog_flag(double_quotes, chars)。

示例查询:

?- 短语(规则,Ls)。
Ls = [f, o, o, b, a, r] ;
Ls = [f, o, o, q, u, u, x] ;
ls = [f, o, o, ' ', b, a, r] ;
ls = [f, o, o, ' ', q, u, u, x] ;
Ls = [f, o, o, ' ', ' ', b, a, r] 。

再举一个例子,让我们改用这个规则:

规则 --> "foo"-- ("bar"| "quux") -- "test"。

现在我们得到例如:

?- 长度(Ls,_),短语(规则,Ls)。
Ls = [f, o, o, b, a, r, t, e, s, t] ;
ls = [f, o, o, b, a, r, ' ', t, e, s, t] ;
Ls = [f, o, o, q, u, u, x, t, e, s, t] ;
ls = [f, o, o, ' ', b, a, r, t, e, s, t];
ls = [f, o, o, b, a, r, ' ', ' ', t, e, s, t] ;
Ls = [f, o, o, q, u, u, x, ' ', t, e, s, t];
ls = [f, o, o, ' ', b, a, r, ' ', t, e, s, t];
ls = [f, o, o, ' ', q, u, u, x, t, e, s, t];
ls = [f, o, o, ' ', ' ', b, a, r, t, e, s, t] ;
Ls = [f, o, o, b, a, r, ' ', ' ', ' ', t, e, s, t] 。

注意如何迭代深化用于公平枚举。

关于prolog - 自定义 DCG 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com