>

Learn Prolog Now 翻译

- 编辑:金沙国际平台登录 -

Learn Prolog Now 翻译

Prolog中有多少个知识库相关的操作命令:assert,retract,asserta,assertz。让我们上学它们是怎样利用的。要是从一个空荡荡的知识库伊始,假如输入指令:

?- listing.

Prolog会简单地复苏true,列表是赤手的。

要是大家输入那么些命令:

?- assert(happy.

Prolog会还原true(assert/1指令始终会中标)。不过关键不是这一个命令能够得逞,而是它对知识库带来的副成效。假若未来我们输入:

?- listing.happy.

即,知识库已经不复是赤手的了:它以往蕴涵了大家申明的多个实际。

设若大家后续输入多个assert命令:

?- assert(happy.true?- assert(happy(marcellus)).true?- assert(happy.true?- assert(happy.true

即便我们以往查询知识库的内容:

?- listing.happy.happy.happy(marcellus).happy.happy.true

大家注明的有着真实境况未来都留存在知识库中了。注意happy在知识库中设有八个,因为我们注明了四遍,看上去是理当如此的。

我们使用的知识库操作实际已经更新了谓词happy/1的意思。更通用地讲,知识库操作命令给予了作者们在运作程序时更新谓词的力量。在运行时期更新谓词定义称为动态谓词,与之相对的是大家后面定义和采用的静态谓词。大许多Prolog解释器都百折不回感觉应该显式地声称动态谓词。我们将会稍后介绍蕴涵动态谓词的例子,未来让大家承继研讨知识库操作命令。

到此结束,大家只通过注解往知识库中增多了事实,但是大家也得以加上准绳。假设我们想要声贝拉米(Bellamy)(Nutrilon)个条条框框说只要任哪个人很欢悦,那么她就很天真,即:

naive :- happy.

咱俩能够这么做:

assert :- happy.

请小心那一个命令的语法:大家申明的条条框框使用一对小括号括起来。若是大家今楚辞知识库有啥样内容:

happy.happy.happy(marcellus).happy.happy.naive :- happy.

于今我们早已领悟假使声明新的音信到知识库中,大家应当也询问假设在没有须要那些音信的时候,将它们从知识库中移除。存在二个和assert/1相反的谓词,名字为retract/1来实现这么些指标。譬喻,若是大家利用下边包车型地铁授命:

?- retract(happy(marcellus)).

下一场列出现在知识库中的全体内容:

happy.happy.happy.happy.naive :- happy.

能够看来,happy(marcellus)这些实际早就被移除。

若果大家承袭:

?- retract(happy.

然后列出现在知识库中的全数剧情:

happy.happy.happy.naive :- happy.

请细心第二个happy,而且只有首先个那样的谜底被移除。

假定想要移除大家定义的happy/1全数的相关新闻,可以运用变量:

?- retract.X = mia;X = butch;X = vincent;false

近日的知识库中,只剩下一个平整:

?- listing.naive :- happy.

一经大家愿意对注明的职分有越多的主宰,这里有三个assert/1的变种,分别是:

  1. assertz。将宣示的内容放在知识库的末段。
  2. asserta。将宣示的内容放在知识库的起来。

举个例子,如果大家从多少个空荡荡知识库起首,然后交到如下的下令:

?- assert, assertz, asserta.

下一场列出知识库中具备的剧情:

?- listing.p.p.true

知识库操作是一项实用的技能。极其是用来保存计算结果时,所以在以后再问一样的难题,大家就足以不要再重新总结贰遍:大家只要求在宣称的真相中一贯询问保存的结果就可以。这种本事称为内部存储器化,可能缓存,这种本事在部分行使中得以鲜明地升级质量。上边是什么样接纳那项才能的简便示例:

:- dynamic lookup/3.add_and_square(X, Y, Res) :- lookup(X, Y, Res), !.add_and_square(X, Y, Res) :- Res is  * , assert(lookup(X, Y, Res)).

本条顺序做了怎么?基本上讲,它使用多少个数字X和Y,将它们相加,然后开展平方运算得出结果。举个例子,大家查询:

?- add_and_square.X = 100true

可是关键在于:程序怎样贯彻?首先,须要静心的是我们已经宣称lookup/3为三个动态谓词。大家须求在运作时亦可修改lookup的概念。其次,请留神定义add_and_square/3时存在八个子句。在那之中第二个子句是数学生运动算,并且将结果运用lookup/3谓词保存到知识库中(即,缓存了运算结果)。第一身长句检查Prolog的当下知识库,看是还是不是留存已经运算过的结果,如若存在,就归纳地回来结果,并暂停第4个子句的实行。

上面是程序运转的事例。若是大家举办另一个询问:

?- add_and_square.Y = 49true

举个例子大家未来查询知识库中留存的新闻会意识早就席卷了:

lookup(3, 7 ,100).lookup.

只要大家再问Prolog关于3,4相加后平方的询问,将不会再展开总括,而是径直回到已经总结过的结果。

有四个难点:大家什么删除全体大家不再要求的实际,假如大家输入指令:

?- retract(lookup.

Prolog将会贰个三个查找全数的真情,然后询问我们是不是想要删除它们。不过存在一个更是便利的诀要,使用下边的指令:

?- retract(lookup.

其一命令将会移除知识库中负有lookup/3相关的谜底。

有关知识库操作的选拔,还大概有部分提议:纵然那是一项实用的工夫,然则知识库操作能够产生有些不佳看,难以明白的代码出现;假如你在三个设有相当多想起的主次中多量运用它们,明白程序含义会成为梦魇。它是Prolog中一项尚未过得硬证明性,非逻辑的才干,大家必要非常小心地动用它。

本文由编程发布,转载请注明来源:Learn Prolog Now 翻译