【问题标题】:Semantic knowledge representation predicate in PrologProlog中的语义知识表示谓词
【发布时间】:2013-05-17 14:23:44
【问题描述】:

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

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

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

这是我的阅读正确还是有其他影响?

【问题讨论】:

  • 书中的语法似乎不在网上(例如,Google 图书预览),但更多语法显示在 this question 中,供感兴趣的人使用。跨度>

标签: prolog dcg


【解决方案1】:

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

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

【讨论】:

  • 好的,这对我来说更清楚了。我有以下疑问:当您在 Prolog shell 中执行命令时:phrase(name(X), [john,jack], Z)。说唱词组谓词到底是什么?看着它,我认为它是一个谓词,表示一个仅由名词组成的短语(必须在 [john,mary] 列表中。是不是有点像,如果在我的 DCG 语法中,我有类似的东西: 短语(X) --> 名称(X) (或类似的东西)?
  • @AndreaNobili phrase/3 只是内置谓词,用于在输入上调用某个 DCG 规则。此外,在您的 SWI-Prolog 控制台中尝试1 ?- apropos(phrase).name 与您的 properName 完全相同。试试看:?- phrase( properName(X), [john,mary,jack],Z).,或?- phrase( properName(john), [john,mary,jack],Z). 等。
  • @AndreaNobili 你可以试试?- listing(phrase). 看看它的定义。
  • mmm 我没有在我的代码中定义短语谓词(我在 Prolog shell 中调用它,如果我列出它,我会得到:?- 列表(短语)。:- meta_predicate 短语(2,?) .短语(A,B):-短语(A,B,[])。:-元谓词短语(2,?,?)。短语(A,D,F):-strip_module(A,C,B), ( var(B) -> throw(error(instantiation_error, _)) ; true ), '$t_body'(B, C:C, E, G, H), D=E, F=G, call(C: H). 真的。:-/
  • @AndreaNobili 对。它是a built-in predicate.。单击该链接。 :)
【解决方案2】:

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

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

“john”是专有名词,“mary”也是。

编辑

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

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

【讨论】:

  • 英文阅读是我鼓励的一种习惯,但我同意你的观点,Andrea 做得太过分了。我试图(显然失败了)提出的观点只是,尝试像 C 或 Python 那样命令式地阅读 Prolog 是错误的和无益的。英语是一个不错的陈述性“目标”,但不是一个很好的目标; Prolog 最好单独阅读为 Prolog。
猜你喜欢
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多