Horn子句有三种类型
定语:¬p?¬q????u
事实:u
目标条款:¬p?¬q???t
与Prolog有关。
Prolog中的Adventures中的Prolog示例
定句是Prolog 规则:
where_food(X,Y) :-
location(X,Y),
edible(X).
Run Code Online (Sandbox Code Playgroud)
事实是Prolog 事实:
room(kitchen).
Run Code Online (Sandbox Code Playgroud)
目标子句是Prolog 查询:
location(X, kitchen), edible(X).
Run Code Online (Sandbox Code Playgroud)
看着三种常见的与Prolog使用的另一种方式head
,body
和:-
。
规则是head :- body.
事实是head.
查询body.
主体由对谓词(头)的调用组成,因此主体可以看起来像这样A,B,C
。
当您使用查询时,它实际上是
goal :- body.
Run Code Online (Sandbox Code Playgroud)
要么
goal <- A,B,C
Run Code Online (Sandbox Code Playgroud)
要么
location(X, kitchen), edible(X) ? goal
Run Code Online (Sandbox Code Playgroud)
事实
location(apple, kitchen).
location(crackers, kitchen).
location(flashlight, desk).
edible(apple).
edible(crackers).
Run Code Online (Sandbox Code Playgroud)
目标条款
location(X, kitchen), edible(X).
Run Code Online (Sandbox Code Playgroud)
回答
X = apple
X = crackers
Run Code Online (Sandbox Code Playgroud)
从Prolog中的谓词开始
ancestor(X,Y) :- parent(X, Z) , ancestor(Z,Y).
Run Code Online (Sandbox Code Playgroud)
where ancestor(X,Y)
被称为head子句,parent(X, Z) , ancestor(Z,Y)
被称为body。
将Prolog转换为蕴涵
:-
是?
,
,?
并且蕴涵被反转。
(parent(X,Z) ? ancestor(Z,Y)) ? ancestor(X,Y)
Run Code Online (Sandbox Code Playgroud)
将文字的连词(?)转换为文字的析取词(?)
not parent(X,Z) ? not ancestor(Z,Y) ? ancestor(X,Y)
Run Code Online (Sandbox Code Playgroud)
结果not parent(X,Z) ? not ancestor(Z,Y)
是Prolog正文,还是您的问题中的target子句。
换句话说,目标条款是实现Prolog头目的需要满足的声明ancestor(X,Y)
。
要查看使用Prolog祖先的示例,请参见Prolog /递归规则。请注意,此示例中给出的规则仅是用于定义祖先的两个规则之一,而缺少的Prolog规则为ancestor(A, B) :- parent(A, B).
爱丁堡大学课程:自动推理学生的Prolog编程-讲座10- 逻辑编程
维基百科中的目标条款定义-
a Horn clause without a positive literal is sometimes called a goal clause
要么 ¬p ? ¬q ? ... ? ¬t
SWI-Prolog 术语表
使用沙沙(Prolog的规则已经存在与此链接进入)
通过在右下方的?-
地方说,your query goes here ...
进入ancestor(X, john).
右下角则点击Run!
上面,你应该看到约翰的祖先
X=david
在那个点击Next
,你应该看到约翰的另一个祖先
X=jim
不断地点击Next
到查看其他祖先,然后最后您应该看到
false
意味着没有更多有效的答案。
摘自Frank Pfenning的《逻辑编程》
为了从推理规则过渡到逻辑编程,我们需要强加特定的策略。提出了两个基本思想:我们可以从猜想中向后搜索,向上生长(潜在的)证明树,或者可以从应用规则的公理出发,直到我们得出猜想。我们称第一个为目标导向,第二个为前向推理。
OP评论
您能告诉我如何进行此类搜索吗,因为当我遇到一些复杂的问题时,我通常不知道如何搜索必要的资源
通常,我会让OP(原始发布者)提出另一个问题,但由于它更多是主观而非客观的问题,因此会在SO(StackOverflow)上以不赞成和不赞成的票数被否决,我可以使用与原始问题,所以我将在这里回答。
在寻找成功之路时,要弄清楚该领域专家当前使用的术语,以及该术语中哪些关键词与您要寻找的东西相关。有时,我会像这些问题一样,不知道这些关键词,disjunction of literals
而且goal
我知道它们是逻辑,推理,定理证明和逻辑语言中的关键词。有时候我还是在猜这个问题时还是在黑暗中。
尝试学习当前术语时,有时会获得成功的一种方法是搜索通常在标题中包含因此是一个很好的关键字的评论文章。例如,将“ 语义学者”与“ 号角子句调查”结合使用,可在首页找到约束逻辑编程:调查survey
survey
作为搜索math canonical form
几乎不相关的数学表达式的典范形式的示例,但是找到了standard from
更常用的表达式之后,获得了更好的结果。
有时候,不是单词可以帮助您找到答案,而依赖单词的搜索引擎会让您失望。对于例如一个类型的搜索我看到每隔几周或所以包括寻找模式/式/等。会产生一个数字序列,您只知道序列的一部分,通常是序列的开头。这是使用OEIS(整数序列在线百科全书)的便捷搜索。与数学相关的另一种搜索引擎是WolframAlpha。因此,请注意其他类型的搜索引擎
一旦有了关键字,就像@WillNess所指出的那样,您有时会以单个单词的形式查询它们goal clause
,但有时会以引号中的确切单词进行查询"goal clause"
。对于这个问题,使用精确的单词可以得到更好的结果。
接下来要实现的是信息的来源通常与信息的质量相对应。
pdf
是一个不错的搜索词。我使用的与计算机科学技术论文相关的其他搜索引擎是:
当然,您可以随时查询其他学术搜索引擎
如果您只有一个或两个吸引您的文档,但仍然没有足够的详细信息,则可以开始整理这些文档中提到的参考文献。这可能是具有挑战性的,因为几年前,许多文章仅在专业期刊上发表,并且不能免费获得。但是,如果其中一位作者是一位教授,并且您可以在他们教学的公开页面下找到列出的文档,则通常可以免费获取这些文章。CiteSeerX非常适合查找参考文档。
如果您使用的是现有的SO回答然后检查标签,看看他们是顶级回答者并记住公认的答案可能不是最好的答案,任何答案可能不是一个正确回答你的问题。
然后,只需阅读几篇文章,以查看最新的信息以及是否一致。即使在互联网的最后20年中,某些领域也正在迅速发展和变化。
不要犹豫,花费一个多小时来进行搜索,然后再花几小时甚至整天阅读。下面是一个问题,我花了四个多小时的搜索和阅读,还是没能找到答案。最终用尽所有尝试后,我发布了该问题,只是发现它无法完成且未记录在案。答案是由我认识的F#专家提供的。
最后,不要害怕留下面包屑,例如像我在Of interest:
评论中或在这个问题上一样,留下您自己的笔记。您经常会一遍又一遍地使用相同的搜索词,如果您在互联网上发布的文章过多,就会开始出现在您自己的文章中。一段时间后,您将意识到,如果只留下面包屑,那将使您的生活更轻松。
剩下的只是多年的经验和勤奋。
有时还会问一个SO问题,寻求帮助,有时会使用答案,有时会被拒绝。
这是我个人的理解,但我会尽力转达。
\n\n“目标条款”背后的直觉是什么?为什么这么称呼它呢?
\n\n首先让我们确认一些定义:
\n\n子句被定义为文字的析取。此外,由于析取运算符是结合的,也就是说,以下属性适用:
\n\n子句还可以被认为是“子”子句的析取,即像\n这样的子句 \n这样的子句\n, \n可以\'分割\'为代表“子”子句的两部分\n \n
\n\n和\n \n
\n
Horn 子句被定义为最多具有一个正文字的子句;因此,它可以采取三种可识别的形式:
\n\n如果比较形式 1 和形式 3,您会发现可以将形式 1 分成两部分(或子条款):一个条款本质上采用“目标条款”的形式,另一个条款是独立的正字面量,我们称之为head。
\n\n此外,这个 Horn 子句可以重新排列成蕴涵形式,如下:
\n\n蕴涵形式也可以被称为“关系”,因为,如果我们给出这个特定的喇叭子句作为前提,我们本质上被告知“它适用于如果第一部分为真,则第二部分为真”。也必然是真实的”。
\n\n名称目标子句现在应该开始变得更有意义了。从自然演绎规则我们知道,给定\n \n \n\n,如果我们也能证明\n \n
\n\n,那么我们可以推导出\n \n
\n。因此,给定一个蕴涵形式的喇叭子句,其本质上是“目标暗示着头”,如果我们证明“目标”是真的,我们可以从逻辑上得出结论,头部分也必须真的。因此,Horn 子句的“目标”部分是我们需要发现它是否可满足的部分,以便得出结论 Head 是否为真。
请注意,我现在在这种情况下所说的“目标”不再是“子句”形式,因为“目标”现在采用(正)文字的合取形式,而不是析取形式的文字。实际上,我现在所说的“目标”我试图证明的逻辑陈述实际上相当于对我们之前提到的“目标子句”的否定(即陈述由否定文字的析取形成)。因此,我们可以将“目标子句”视为子句形式的相关陈述,即对应于我们试图证明的目标的否定;Horn 子句的子句部分(当以“子句”形式书写时)被否定,从而产生蕴涵形式中的目标成分。
\n\n当然。请注意,独立的“目标条款”陈述相当于陈述“目标意味着错误”(或者更重要的是,假设“目标”为真,则不会进一步证明/不会产生任何更多信息)。因此,一个独立的“目标条款”本质上相当于一个没有头部的目标,即一个目标在满足时不能证明其他任何东西。
\n\n如果我们有一个没有标题的目标,那么我们本质上是被要求评估该目标是否可以实现,但没有将其与需要推论的标题联系起来。仅仅为了好玩而必须评估目标的概念可能听起来很奇怪,但是当您意识到某些谓词会对系统造成副作用时,它在 Prolog 术语中就开始有意义了。例如,在 Prolog 中,这样的语句:
\n\n:- dynamic pred1, pred2.\n:- writeln("I have just reached the end of the database file").\n
Run Code Online (Sandbox Code Playgroud)\n\n将在读取数据库(即您的序言“脚本”)时当场进行评估,并对系统产生副作用,但不会导致事实或关系进入知识数据库。在 Prolog 中,这种旨在现场计算并对运行时环境造成副作用的“无头”语句通常称为指令。
\n\n目标子句和查询之间有什么关系?它们是一样的吗?
\n\n嗯,不。他们是相关的。具体来说,通过尝试证明目标无法满足来执行查询(在幕后),即我们首先假设目标为假(或等效地,目标子句为真)。然后,Prolog 会遍历数据库,并尝试匹配文字,或尝试替换,就像它试图满足目标以推导出明确子句的中心语一样。如果我们遇到满足此目标的替换,那么在查询的上下文中,这会导致矛盾。因此,查询会报告在这些替换下否定目标会导致矛盾的术语。换句话说,这些替换是满足目标的替换。
\n\n编辑:(解决评论)。
\n\n来自维基百科:
\n\n\n\n\nProlog 程序的执行是由用户发布单个目标(称为查询)来启动的。从逻辑上讲,Prolog 引擎尝试找到否定查询的解析反驳。Prolog使用的解析方法称为SLD解析。如果否定的查询可以被反驳,那么带有适当的变量绑定的查询就是程序的逻辑结果。在这种情况下,所有生成的变量绑定都会报告给用户,并且查询被认为已成功
\n
以下是如何在后台实现查询的示例。假设您有以下知识库:
\n\na. % premise 1\nb :- a. % premise 2\n% ... plus many other facts and relationships not involving a or b\n
Run Code Online (Sandbox Code Playgroud)\n\nprolog语句b :- a
本质上对应于逻辑语句a -> b
,它相当于逻辑语句\xc2\xaca v b
。所以我们被给定\xc2\xaca v b
和a
作为前提。
现在假设您提出以下查询:
\n\n?- b.\n
Run Code Online (Sandbox Code Playgroud)\n\n这相当于说“嘿,Prolog,这个陈述是b is true
真还是假?”
仅仅开始随机评估语句来查看它们是否会产生b is true
结果是非常低效的。因此,为了证明(在数学意义上)b is true
,Prolog 的推理如下:“我将首先假设 事实b
是错误的,然后开始将其插入到相关前提中。如果这个假设迫使证伪在我认为正确的任何前提中,这证明该假设实际上不成立,因此 b 被证明为真。”
从编程上来说,这可能是这样的:
\n\nb
并测试它们\xc2\xaca v b
。这需要评估为真,因为这是一个前提。由于假设 b 为假,因此要使该前提评估为真,则a
必须为假。因此,这个假设\xc2\xacb
会导致矛盾,因此是错误的。这就证明了这个说法b is true
。
这个例子只涉及文字。当涉及到带有变量的谓词时,可能存在一些变量替换,“\xc2\xacb”也会以类似的方式导致矛盾。因此我们得出结论“b 对于以下替换被证明是正确的”,然后 Prolog 将报告 b 被证明为正确的相关替换。
\n 归档时间: |
|
查看次数: |
414 次 |
最近记录: |