Prolog中的语义知识表示谓词

时间:2013-05-17 14:23:44

标签: prolog dcg

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

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

我应该如何阅读这些谓词?我认为它们的意思是:由字符串“john”表示的列表元素是一个正确的名称,而这个正确的名称是John(对于Mary来说也是如此)。

我的阅读是否正确或是否有其他影响?

2 个答案:

答案 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”的语义知识(它使用命名作为自我记录功能,但文档不是代码)。

谓词允许原子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.