公司网站开发费摊销,wordpress 添加微博,wordpress多站点详细设置(图解),核酸造假7人枪毙视频人工智能语言简介
人工智能(AI)语言是一类适应于人工智能和知识工程领域的、具有符号处理和逻辑推理能力的计算机程序设计语言。能够用它来编写程序求解非数值计算、知识处理、推理、规划、决策等具有智能的各种复杂问题。
典型的人工智能语言主要有LISP、Prolog、Smalltalk、…人工智能语言简介
人工智能(AI)语言是一类适应于人工智能和知识工程领域的、具有符号处理和逻辑推理能力的计算机程序设计语言。能够用它来编写程序求解非数值计算、知识处理、推理、规划、决策等具有智能的各种复杂问题。
典型的人工智能语言主要有LISP、Prolog、Smalltalk、C等
一般来说人工智能语言应具备如下特点
具有符号处理能力即非数值处理能力适合于结构化程序设计编程容易具有递归功能和回溯功能具有人机交互能力适合于推理既有把过程与说明式数据结构混合起来的能力又有辨别数据、确定控制的模式匹配机制。
Prolog 语言简介
PROLOG(Programming in Logic)是当代最有影响的人工智能语言之一。
它是一种以逻辑推理为基础的逻辑型程序设计语言。
由于该语言很适合表达人的思维和推理规则在自然语言理解、机器定理证明、专家系统等方面得到了广泛的应用已经成为人工智能应用领域的强有力的开发语言。
Prolog基本语句
Prolog的基本语句仅有三种即事实、规则和目标三种类型的语句且都用谓词表示。
1、事实
事实用来说明一个问题中已知的对象和它们之间的关系。在Prolog程序中事实由谓词名及用括号括起来的一个或几个对象组成。谓词和对象可由用户自己定义。例如likes(bil,book).表示一个名为like的关系对象bill和book之间有喜欢的关系。
事实(facts)是prolog中最简单的谓词(predicate)。
谓词Prolog语言的基本组成元素可以是一段程序、一个数据类型或者是一种关系。
它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。
事实的语法结构如下
pred(arg1,arg2,…argN).其中pred为谓词的名称。arg1,… 为参数共有N个。
参数构成规则如下
由大写字母A-Z; 小写字母a-z; 数字0-9±/^,.~:.?#$ 等构成。原子通常是字母、数字和下划线组成开头的字符必须是小写字母下划线不能放在最前面。使用单引号扩起来的字符集都是合法的原子。变量和原子相似但是开头字符是大写字母或是下划线下划线开头的都是变量
Eg1
door(kitchen,office).
?- door(X,office).
X kitchen;
X no.prolog不允许使用除了基本字符以外的字符不允许使用汉字。最末尾的”.”一定不能掉它表示一个句子结束。以小写字符开头的字符串代表确知的事物而以大写字母开头的字符串表示未确定的事物让解释器找到答案。“;” 是人工输入的当解释器找到一一个答案之后它将个答案输出并且等待用户的进一步输入如果用户输入解释器将继续寻找其他的答案。首先它必须释放变量X。然后从上一次成功的位置的下一条子句开始继续搜索。这个过程叫做回溯。如果输入的是别的符号解释器将终止查询。no是因为系统在输出了kitchen这个答案以后用户输入“;”表示还想知道其他的答案而解释器又找不到其他的答案了于是输出no.来终止查询。
2、规则
规则由几个互相有依赖性的筒单句谓词组成用来描述事实之间的依赖关系。从形式上看规则由左边表示结论的后件谓词和右边表示条件的前提谓词组成。例如bird():-animal(),has(X,feather).表示凡是动物并且有羽毛那么它就是鸟。
规则的实质就是储存起来的查询。它的语法如下
head:-body其中head是谓词的定义部分与事实一样也包括谓词名和谓词的参数说明。-连接符一般可以读作’如果’。
body一个或多个目标与查询相同。
where food(X,Y):-location(X,Y),edible(X).用语言来描述就是在房间Y中有可食物X的条件是X在Y房间中并且X可食。
规则的搜索原理
首先Prolog将把目标和规则的子句的头部(head)进行匹配如果匹配成功Prolog就把比规则的body部分作为新的目标进行搜索。
实际上规则就是多层的询问。第一层由原始的目标组成从下一层开始就是由与第一层的目标相匹配的规则的Body中的子目标组成。
每一层还可以有子目标理论上来讲这种目标的嵌套可以是无穷的。但是由于计算机的硬件限制子目标只可能有有限次嵌套。
3、目标问题/查询
把事实和规则写进Prolog程序中后就可以向Prolog询问有关问题的答案询问的问题就是程序运行的目标。目标的结构与事实或规则相同可以是一个简单的谓词也可以是多个谓词的组合。例如-student(john).表示john是学生吗”
查询谓词间的并且关系
?- location(X,kitchen),edible(X).
Xapple;
Xcrackers
no.简单的查询只有一个目标而混合查询可以把这些目标连接起来从而进行较为复杂的查询。上面的连接符号,是并且的意思。
上面的式子用语言来描述就是“寻找满足条件的X,条件是X在厨房里并且X能吃。”
如果某个变量在询问中多次出现则此变量在所有出现的位置都必须绑定为相同的值。
所以上面的查询只有找到某一个X的值使得两个目标都成立才算查询成功。
规则子句间的或者关系
connect(X,Y):-door(XY).
connect(X,Y):-door(Y,X).?connect(kitchen,office).
yes?-connect(office,kitchen).
yes意为“房间X和Y相连的条件是从X到Y有扇门或者从Y到X有扇门。
请注意此处的或者为了描述这种或者的关系我们可以为某个谓词定义多个子句。
内部谓词
内部谓词是指已经在Prolog中事先定义好的谓词。
在内存中的动态数据库中是没有内部谓词的子句的。当解释器遇到了内部谓词的目标它就直接调用事先编好的程序。 write/1此谓词被调用时永远是成功的并且它可以把它的参数作为字符串输出到屏幕上。当回溯时它永远是失败所以回溯是不会把已经写到屏幕上的字符又给删除的。 nl/0此谓词没有参数和write一样从Call端口调用时总是成功的从Redo端口回溯时总是失败的它的作用是在屏幕上输出一个回车符。 tab/1此谓词的参数是一个整数它的作用是输出n个空格为它的参数。其控制流程与上面两个相同。 fail/0它的调用永远是失败的。如果fail/0从左边得到控制权则它立即把控制权再传回到左边引起回溯。
算术
Prolog专门提供了内部谓词is来计算数学表达式。其语法形式
X is 数学表达式?- X is 22.
X 4?- X is 3*(42).
X 18除了is外Prolog还提供了一些用来比较大小的操作符
X Y
X Y
X Y
X Yeg:
?- X is 22 ,X 3.
X 4?- X is 22 , 3 X.
no数据管理内部谓词
asserta(X) 把子句X当作此子句的谓词的第一个子句加入到动态数据空中。他和I/O内部谓词的流程控制相同。回溯是失败并且不会取消它所完成的工作。例如:如果内存中已经有了下面的几个事实: people(a).
people(b).
people(c).如果运行了asserta(people(d))之后内存中的people/1的子句就变成了下面这个样子: people(d).
people(a).
people(b).
people(C).assertz(X): 和asserta/1的功能 类似只不过它把X子句追加为最后一个子句。 retract(X): 把子句X从动态数据库中删除。此操作也是永久性的也就是说回溯的时候不能撤销此操作。
联合
Prolog的最强大的功能之一就是它内建了模式匹配的算法——联合。
变量任何项目变量可以与任何项目绑定其中也包括变量。
原始项目原始项目两个原始项目原子或整数只有当它们相同时才能联合。
结构结构如果两个结构的每个相应的参数能联合那么这两个结构可以联合
为了更清楚地介绍联合操作我们将使用Prolog的内部谓词‘/2‘此谓词当它的两个参数能够联合时成功反之则失败。它的语法 如下
(arg1,arg2)为了方便阅读也可以写成如下形式
arg1 arg2注意此处的等号在Prolog中的意义与其他语言中的不同。它不是数学运算符或者赋值符。
数据结构
通过把这些最简单的数据组合起来可以生成复杂的数据类型我们称之为结构。
结构有结构名和一定数量的参数组成。
这与以前所学过的目标和事实是一样的。
functor(arg1,arg...)例:
location_s(object(candle, red, small, 1), kitchen).
location_s(object(apple, red, small, 1), kitchen).
location_s(object(apple, green, small, 1), kitchen).
location_s(object(table, blue, big, 50), kitchen).Prolog的变量是没有数据类型之分的所以它可以很容易的绑定为结构如同它绑定为原子一样。事实上原子就是没有参数的最简单的结构。因此可以有如下的询问:
?- location_s(X, kitchen).
X object(candle, red, small, 1);
X object(apple, red, small, 1);
X object(apple, green, small, 1);
X object(table, blue, big, 50);
no列表
列表是一组项目的集合此项目可以是Prolog的任何数据类型包括结构和列表。
列表的元素由方括号括起来项目中间便用逗号分割。
当某个列表中没有项目时我们称之为空表使用“[]”表示。也可以使用nil来表示。下面是一般的列表形式:
[X|Y]使用此列表可以与任意的列表匹配匹配成功后X绑定为列表的第一个项目的值我们称之为表头(head) 。而Y则绑定为剩下的列表我们称之为表尾(tail)。 例:
?- [a|[b,c,d]] [a,b,c,d].
true.上面的联合之所以成功是因为等号两边的列表是等价的。注意表尾tail一定是列表而表头则是一个项目可以是表也可以是其他的任何数据结构。下面的匹配失败在“|”之后只能是一个列表而不能是多个项目。 例:
?- [a|b,c,d] [a,b,c,d].
no含有递归的列表
例
member(H,[H|T]).
member(X,[H|T]):-member(X,T).谓词member/2用来判断某个项目是否在列表中。
第一个子句是边界条件即最简单的情况某项目是列表中的元素如果此项目是列表的表头。
第二个子句用到了递归其意义是如果项目是某表的表尾tail的元素那么它也是此列表的元素。
请注意两个member/2谓词的第二个参数都是列表。由于第二个子句中的T也是一个列表所以可以递归地进行下去。
截断
Prolog具有能够回溯但并不是所有的回溯都是必须的这时我们需要能够人工地控制回溯过程。Prolog提供了完成此功能的谓词cut使用符号!来表示。
Cut能够有效地剔除一些多余的搜索。如果在cut处产生回溯它会自动地失败而不去进行其它的选择。当在回溯遇到cut时它改变了回溯的流程它直接把控制权传给了上一级目标而不是它左边的目标。这样第一层的中间的那个目标以及第二层!左边的子目标都不会被Prolog重新满足。
当你能够确信在谓词中的某一点只有一个答案或者没有答案时使用cut可以提高程序的效率另外如果在某种情况下你想让某个谓词强制失败而不让它去寻找更多的答案时使用cut也是个不错的选择。
例
事实:
data(one).
data(two).
data(three).规则
规则中没有使用cut的情况:
cut_test_a(X) :- data(X), cut_test_a(last clause).规则中没有使用cut的查询:
?- cut_test_a(X), write(X), nl, fail.
one
two
three
last clause
no使用了cut之后的规则:
cut_test_b(X):- data(X), !.cut_test_b(last clause).规则中使用了cut之后的查询:
?- cut_test_b(X),write(X),nl,fail.
one
no流程控制
prolog程序中没有if、when、case、 for这样的控制流程语句。
使用失败来完成相同功能的内部谓词————repeat/0。
它在第一次调用时永远成功并且在回溯时也永远成功。换句话说流程不可能回溯通过repeat/0。如果某个子句中有repeat/0并且其后有fail/0谓词出现那么将永远循环下去。使用这种方法可以编写死循环的Prolog程序。如果在repeat/0谓词后面加入几个中间目标并且最后使用一个测试条件结束那么程序将一直循环到条件满足为止。这相当于其它程序语言中的do until。
自然语言
例下面是两个简单的英语句子
The dog ate the bone.
The big brown mouse chases a lazy cat.我们可以使用下面的语法规则来描述这种句子
sentence:nounphrase, verbphrase.nounphrase:determiner, nounexpression.nounphrase:nounexpression.nounexpression:noun.nounexpression:adjective、,nounexpression.verbphrase:verb,nounphrase.determiner:dog|bone|mouse|cat.verb:ate|chases.adjective:big|brown|lazy.第一条规则说明一个句子有一个名词短语和一个动词短语构成。最后的一个规则定义了单词bigbrown和lazy是一个形容词中间的|表示或者的意思。
首先来判断某个句子是合法的句子。我们编写了sentence/1谓词它可以判断它的参数是否是一个句子。句子必须用Prolog的一种数据结构来表达这里使用列表。
例如前面的两个句子的Prolog表达形式如下:
[the,dog,ate,the,bone]
[the,big,brown,mouse,chases,a,lazy,cat]分析句子的方法有两种:
第一种是选择并校样的方法见后面的人工智能实例部分使用这种方法首先把句子的可能分解情况找出来再来测试被分解的每一个部分是否合法。 第二种是我们前面已经介绍过使用append/3谓词能够把列表分成两个部分。使用这种方法顶层的规则可以是如下形式
sentence(L) :- append(NP,VP,L), nounphrase(NP), verbphrase(VP).appeend/3谓词可以把列表L的所有可能的分解情况穷举出来分解后的两个部分为NP和VP其后的两个目标则分别测试NP和VP是否是合法的如果不是则会产生回溯从而测试其他的分解情况。
谓词nounphrase/1和verbphrase/1的编写方法与sentence/1基本相同他们调用其他的谓词来判断句子中的更小的部分是否合法直到调用到定义单词的谓词。
差异表
例
sentence(S):- nounphrase(S-S1), verbphrase(S1-[]).差异表由两个相关的表构成第一个表称为全奏而第二不表称为余表。这两个表可以作为谓词的两个参数不过我们通常使用”-“连接这两个表这样易于阅读。它的形式是X-Y。
我们使用差异表改写了第一条语法规则。如果能够从列表S的头开始提取出一个名词短语其余部分S1,并且能够从S1的头开始提取出一个动词短语并且其余部分为空表那么列表S是一个句子。
差异表所表示的表是全表和余表之间的差异。