【问题标题】:Custom DCG Operators自定义 DCG 运算符
【发布时间】:2019-01-04 20:52:12
【问题描述】:

假设我想编写一个自定义运算符来以一种重复的方式组合 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 具有相同通用性的新运算符?

【问题讨论】:

  • 请使用2 代替*。即::- meta_predicate --(2,2,?,?).
  • 如果您要删除您的question,请不要期望得到答案。

标签: prolog dcg meta-predicate


【解决方案1】:

是的,这是可能的。

目前主要的问题是:

?- 可调用(“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] 。

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

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2022-01-14
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多