我正在使用 Ivan Bratko 的人工智能编程在 Prolog 中研究DCG 语法和解析树。在一个使用 DCG 语法来推断句子含义的程序中,我发现这两个谓词代表了一种语义知识:
properName(john) --> [john].
properName(mary) --> [mary].
我应该如何阅读这些谓词?我认为它们的意思是:由字符串“john”表示的列表元素确实是一个专有名称,而这个专有名称是约翰(玛丽也是如此)。
是我的阅读正确还是有其他含义?
这是一个微不足道的谓词,不适合在使用它的上下文之外进行解释。
换句话说,它只能用于要求以某种方式使用专有名称,通过在右侧使用它的 DCG 规则。你展示它的方式,孤立地,它意味着:
'john' 是一个专有名称,'mary' 也是。
编辑
我在这里可能错了,但是您仍然滥用英语来描述使用正式语言最好描述的事物。Prolog 是一种形式语言,具有定义的语法和语义。它可以用来正式描述逻辑关系或计算。试图忠实地将其翻译成英文必然是笨拙和不必要的。像你问题中的谓词这样微不足道的东西变成了愚蠢、难以理解和难以处理的东西。
PS 你非常喜欢这个词的正确拼写是representation。 http://machaut.uchicago.edu/?resource=Webster%27s&word=representation&use1913=on
properName(X)
只是一个一元规则(在 DCG 的上下文中;它是 Prolog 中的三元谓词 - 用 来检查?- listing(properName)
)。你可以称它为“袜子”或“果酱”,这完全取决于你。因此,在代码中找不到关于它表示专有名称“john”或“mary”的语义知识(它使用命名作为自文档功能,但文档不是代码)。
谓词允许原子john
或mary
出现在输入流中,仅此而已;并要求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.