1

我正在使用 Ivan Bratko 的人工智能编程在 Prolog 中研究DCG 语法解析树。在一个使用 DCG 语法来推断句子含义的程序中,我发现这两个谓词代表了一种语义知识

properName(john) --> [john].
properName(mary) --> [mary].

我应该如何阅读这些谓词?我认为它们的意思是:由字符串“john”表示的列表元素确实是一个专有名称,而这个专有名称是约翰(玛丽也是如此)。

是我的阅读正确还是有其他含义?

4

2 回答 2

2

这是一个微不足道的谓词,不适合在使用它的上下文之外进行解释。

换句话说,它只能用于要求以某种方式使用专有名称,通过在右侧使用它的 DCG 规则。你展示它的方式,孤立地,它意味着:

'john' 是一个专有名称,'mary' 也是。

编辑

我在这里可能错了,但是您仍然滥用英语来描述使用正式语言最好描述的事物。Prolog 是一种形式语言,具有定义的语法和语义。它可以用来正式描述逻辑关系或计算。试图忠实地将其翻译成英文必然是笨拙和不必要的。像你问题中的谓词这样微不足道的东西变成了愚蠢、难以理解和难以处理的东西。

PS 你非常喜欢这个词的正确拼写是representationhttp://machaut.uchicago.edu/?resource=Webster%27s&word=representation&use1913=on

于 2013-05-17T14:38:07.877 回答
2

properName(X)只是一个一元规则(在 DCG 的上下文中;它是 Prolog 中的三元谓词 - 用 来检查?- listing(properName))。你可以称它为“袜子”或“果酱”,这完全取决于你。因此,在代码中找不到关于它表示专有名称“john”或“mary”的语义知识(它使用命名作为自文档功能,但文档不是代码)。

谓词允许原子johnmary出现在输入流中,仅此而已;并要求X与那个原子统一。

你可以这样定义它:

name(X) --> [X], { member(X, [john, mary]) }.

然后,

4 ?- phrase( name(X), [john,jack], Z).
X = john,
Z = [jack] ;
false.

5 ?- phrase( name(X), [jack,john], Z).
false.

8 ?- phrase( name(X), [john,mary], Z).
X = john,
Z = [mary] ;
false.

9 ?- phrase( name(X), [mary,john,jack], Z).
X = mary,
Z = [john, jack].

11 ?- phrase( name(jack), [jack,mary,john], Z).
false.
于 2013-05-17T17:09:43.420 回答