Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的语义知识表示谓词_Prolog_Dcg - Fatal编程技术网

Prolog中的语义知识表示谓词

Prolog中的语义知识表示谓词,prolog,dcg,Prolog,Dcg,我正在使用Ivan Bratko的人工智能编程在Prolog中学习DCG语法和解析树。在一个使用DCG语法推断句子含义的程序中,我发现这两个谓词,我认为,它们代表一种语义知识: properName(john) --> [john]. properName(mary) --> [mary]. 我应该如何阅读这些谓词?我认为它们的意思是:字符串“john”表示的列表元素确实是一个专有名称,而这个专有名称是john(对Mary来说也是这样) 这是我的阅读正确还是有其他含义?这是一个微不

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

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


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

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

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

“约翰”是个正名,“玛丽”也是

编辑

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

另外,你非常喜欢的单词的正确拼写是表示法。
这是一个微不足道的谓词,不适合在使用它的上下文之外进行解释

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

“约翰”是个正名,“玛丽”也是

编辑

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

另外,你非常喜欢的单词的正确拼写是表示法。
properName(X)
只是一元规则(在DCG的上下文中;它是Prolog中的三元谓词-请使用
?-列表(properName)
)。你可以叫它“袜子”或“果酱”,完全由你决定。因此,在代码中找不到关于它表示专有名称“john”或“mary”的语义知识(它使用命名作为自文档功能,但文档不是代码)

谓词允许atom
john
mary
出现在输入流中,而不允许出现其他内容;并要求X与原子统一

你可以这样定义它:

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

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

谓词允许atom
john
mary
出现在输入流中,而不允许出现其他内容;并要求X与原子统一

你可以这样定义它:

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


英语阅读是我鼓励的一种习惯,但我同意你的看法,安德里亚做得太过分了。我试图(显然失败了)指出的一点是,试图像C或Python那样强制阅读序言是错误的,也是无益的。英语是一个不错的声明性“目标”,但不是一个伟大的目标;序言最好是单独读序言。英语阅读是我鼓励的一种习惯,但我同意你的看法,安德里亚做得太过分了。我试图(显然失败了)指出的一点是,试图像C或Python那样强制阅读序言是错误的,也是无益的。英语是一个不错的声明性“目标”,但不是一个伟大的目标;Prolog最好单独作为Prolog阅读。好的,这对我来说更清楚。我有以下疑问:当在Prolog shell中执行命令时:phrase(name(X),[john,jack],Z)。现在的短语谓词到底是什么?看着它,我认为它是一个谓词,表示一个只由一个名词(必须在[john,mary]列表中)组成的短语。在我的DCG语法中,是否有类似的东西:短语(X)->名称(X)(或类似的东西)“@AndreaNobili只是一个内置谓词,用于对输入调用特定的DCG规则。此外,请在您的SWI Prolog控制台中尝试
1?-apropos(短语)。
name
与您的
properName
完全相同。尝试它:
?-phrase(properName(X),[john,mary,jack],Z)。
,或
?-phrase(properName(john),[john,mary,jack],Z.
等@AndreaNobili您可以尝试
?-列出(短语)。
查看其定义。嗯,我的代码中没有定义短语谓词(我在Prolog shell中称之为短语谓词,如果我将其列出,我将获得:?-列出(短语)。:-元谓词短语(2),短语(A,B):-短语(A,B,[]):-短语(A,B),-元谓词短语(2,,,)短语(A,D,F):-strip_模块(A,C,B),(var(B)->throw(error(实例化_error,);true),'$t