【问题标题】:How do Prolog translates DCG rules into definite clauses?Prolog 如何将 DCG 规则翻译成明确的从句?
【发布时间】:2015-12-08 15:49:41
【问题描述】:

我正在研究定从句语法,但我在理解 Prolog 如何将 DCG 规则转换为定从句时遇到了一些问题。 例如,这里有一个写成 DCG 的小语法:

s --> np, vp.

np --> det, n.

vp --> v, np.
vp --> v.

det --> [the].
det --> [a].

n --> [woman].
n --> [man].

v --> [kisses].

如果我提出疑问:

?-listing(s).

它回答我:

s(A,C) :- 
     np(A,B),
     vp(B,C).

这是什么意思?为什么有两个论点?

另外,这里的“C”是什么意思:

det(A,B) :-
    'C'(A,the,B).

?

谢谢!

【问题讨论】:

  • 你在哪里看到'C'(A,the,B).?当我尝试时,您的原始 DCG 源的列表没有显示 det/2 的定义。但是直接回答这个问题,'C' 是一个原子,所以'C'(A,the,B) 是一个名为'C' 的谓词的调用,带有三个参数:A(变量)、the(原子)和@987654333 @ (多变的)。 s(A,C) 有两个参数,因为 Prolog 在内部为差异列表添加了一个参数,这就是它实现 DCG 的方式。您通常会使用phrase(s, L) 致电 DCG。
  • 只是出于好奇。我读到有时 Prolog 实现会转换规则,例如:det --> [the]。不进入 det([the|W],W)。但进入 det(A,B) :- 'C'(A,the,B)。
  • 好的,很有趣。正如我所提到的,'C' 是一个原子,就像任何其他原子一样,所以它只是一个谓词的名称。它没有特别的意义。如果你愿意,你可以命名一个谓词'This is my awesome predicate'(X, Y)。 :)
  • 也许this question 有帮助?
  • 非常感谢您的回答 :),但我仍然怀疑 s(A,C) 的工作原理:/

标签: prolog dcg


【解决方案1】:

使用了一个称为差异列表的概念。假设您要进行解析(您也可以使用这些谓词生成列表,但我们暂时忽略它)。

如果你解析一个列表,比如[the,man,kisses,the,woman]。您可以将其视为一系列单词,我从@Vikramnath Venkatasubramani“借用”了火车类比,因此归功于他/她。现在如果我们打电话给s([the,man,kisses,the,woman],C)C 将返回 []

发生的情况是,在每个谓词处将断开零个、一个或多个货车。所以这意味着在以下情况下:

s(A,C) :-
    np(A,B),
    vp(B,C).

np/2 将断开货车[the,man],导致它仍然存储剩余的火车B=[kisses,the,woman]。现在vp/2 将断开所有剩余的货车,导致C=[],一列空火车。

这是如何实现的

让我们考虑部分语法的实现。

s(A,C) :-
    np(A,B),
    vp(B,C).

np(A,B) :-
    det(A,D),
    n(D,B).

vp(B,C) :-
    v(B,E),
    np(E,C).
vp(B,C) :-
    v(B,C).

det([the|W],W).
det([a|W],W).

n([woman|W],W).
n([man|W],W).

v([kisses|W],W).

如前所述,你打电话给np([the,man,kisses,the,woman],B)np/2 将不得不断开构成名词短语的货车:[the,man]

np/2 轮到他打电话给det/2n/2。现在det/2 将断开限定符:the,而n/2 将断开名词man,因此更明确:

np([the,man,kisses,the,woman],[kisses,the,woman]) :-
    det([the,man,kisses,the,woman],[man,kisses,the,woman]),
    n([man,kisses,the,woman],[kisses,the,woman]).

现在det/2不再重定向它的职责,它被实现为:

det([the|W],W).

现在,如果我们进行模式匹配,这将基于:

det([the,man,kisses,the,woman],[man,kisses,the,woman]).

所以这意味着它已经断开了the

使用这种方法的优点是可以在恒定时间内完成断开连接。实际上,谓词并不知道列表的整个尾部。

此外,它还允许在一个事实中断开多个单词。例如,您将您的名字添加为名词:

n([s,dallapalma|W],W).

在这种情况下,n/2 将同时断开两辆货车。其他谓词不需要知道这一点,s/2 也不需要决定在哪个点将火车在np/2vp/2 之间分开:它让np/2 断开与它一样多的货车想要,而vp/2 将致力于与火车的其余部分合作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多