我正在使用Ivan Bratko的人工智能编程在Prolog中学习 DCG语法和解析树。在一个使用DCG语法来推断句子含义的程序中,我发现这两个谓词,我认为,代表了一种语义知识:
properName(john) --> [john].
properName(mary) --> [mary].
我应该如何阅读这些谓词?我认为它们的意思是:由字符串“john”表示的列表元素是一个正确的名称,而这个正确的名称是John(对于Mary来说也是如此)。
我的阅读是否正确或是否有其他影响?
答案 0 :(得分:2)
这是一个微不足道的谓词,不适用于使用它的上下文之外的解释。
换句话说,它只能用于要求以某种方式使用正确的名称,通过在其右侧使用它的DCG规则。你单独展示它的方式,仅仅意味着:
'john'是一个正确的名字,'mary'也是如此。
修改强>
我可能在这里错了,但您仍在滥用英语来描述使用正式语言最佳描述的内容。 Prolog是一种形式语言,具有定义的语法和语义。它可以用于正式描述逻辑关系或计算。试图忠实地将其翻译成英语肯定是笨拙和不必要的。像你的问题中的谓词一样微不足道的东西变成了愚蠢,难以理解和难以使用的东西。
P.S。您喜欢的单词的正确拼写是表示。 http://machaut.uchicago.edu/?resource=Webster%27s&word=representation&use1913=on
答案 1 :(得分:2)
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.