清新de花 发表于 2016-3-10 09:00:28

Visual Prolog运行环境实验

本帖最后由 清新de花 于 2016-3-10 09:05 编辑

实验一 Visual Prolog运行环境实验(1学时)一、实验目的1、了解PROLOG解释器;2、掌握PROLOG语言中常量、变量的表示方法;3、掌握利用PROLOG进行事实库、规则库的编写方法。二、实验要求1、熟悉Visual Prolog运行环境,包括硬件与软件环境;2、学习示例程序,分析其功能;3、写出Example 1、Example2、Example 3示例程序的功能;4、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。三、实验设备计算机,Visualprolog教学软件。四、实验内容及步骤(一)实验内容:1、熟悉Visual prolog的运行环境,包括所用的机器的硬件与软件环境;2、学习使用Visual prolog,包括进入Prolog主程序、编辑源程序、修改环境目录、退出等基本操作;3、学习Visual prolog的简单程序结构,掌握分析问题、询问解释技巧;4、了解PROLOG语言中常量、变量的表示方法;5、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。(二)实验步骤:1、启动Windows 2000操作环境;2、安装Visual Prolog集成开发环境;3、双击桌面图标或者找到Visual Prolog可执行文件所在目录双击图标,启动Visual prolog集成开发环境;4、打开Project菜单,选择NewProject菜单项,将工作目录修改为你要保存到的文件夹,例如,c:\11,给出工程文件名;5、打开Option菜单,选择Project菜单项打开下拉菜单,选择Compiler Options项,按下图中显示进行设置;6、从工程界面中选择“new”按钮或者从file菜单中选择“new”菜单项,弹出一个界面,将所有的复选框都去掉,进入Visual Prolog的程序编辑界面;7、将下面的Example 1编辑到编辑界面里面,Project菜单里面的Test goal菜单项或者直接点击菜单栏中的Test Goal按钮执行程序。查看执行结果显示窗口中结果是否与理论分析的结果一致;8、仿前例,运行Example 2、Example 3,分析程序功能;9、保存每个.Pro文件,保存工程。退出Visual Prolog系统,返回到Windows2000环境。五、源程序Example 1:domains   person,activity = symbolpredicates    likes(person,activity)clauses    likes(ellen,tennis).    likes(john,football).    likes(tom,baseball).    likes(eric,swimming).    likes(mark,tennis).    likes(bill,X):-likes(tom,X).goal    likes(bill,What).Example 2:domains      element=c(char);i(integer);r(real);s(symbol)      mixlist=element*predicates      length(mixlist, integer)clauses      length([],0).      length(,L):-length(T,L1),L=L+1.   goal      length(,X).Example 3:predicates   fac(integer,real)clauses   fac(1,1):-!.fac(X,FactX):- Y=X-1, fac(Y,FactY), FactX=X *FactY. goal    fac(3,X).

实验二 知识表示、推理、搜索实验(10学时)正确完成给15分一、实验目的1、掌握利用PROLOG进行推理、问题求解的方法。2、掌握PROLOG编程技巧。二、实验要求对同学进行分组,每组完成一题:1.      野人与传教士过河问题:有传教士和野人各三人需要过河,他们都会划船。现只有一条船,一次只能载两人。假设野人多于传教士时传教士就会被吃掉。试编程求出所有能确保全部安全的过河的计划,并给出VisualProlog程序。2.      农夫和小米问题:农夫、狐狸、鸡和米都在一条河的左岸,现在要把它们全部送到右岸去,农夫有一条船,过河时,除农夫外,船上至多能载狐狸、鸡和米中的一样。狐狸要吃鸡,鸡要吃米,除非农夫在那里。试编程求出所有能确保全部安全的过河的计划,并给出Visual Prolog程序。3.      八皇后问题模拟:在8′8格的国际象棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。试编程求出所有能满足要求的摆法,并给出Visual Prolog程序。4.      谁是盗窃犯问题:某人被盗,公安局派出所派出5个侦察员去调查。研究案情时:   侦察员A说:“赵与钱中至少有一人作案”;   侦察员B说:“钱与孙中至少有一人作案”;   侦察员C说:“孙与李中至少有一人作案”;侦察员D说:“赵与孙中至少有一人与此案无关”;侦察员E说:“钱与李中至少有一人与此案无关”。如果这5个侦察员的话都是可信的,试编程求出谁是盗窃犯,并给出Visual Prolog程序。5.理发师问题:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉; 第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待; 如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。试编程求出谁是盗窃犯,并给出Visual Prolog程序。三、实验设备计算机,Visualprolog教学软件。四、实验内容及步骤(一)实验内容:
后面请同学们根据不同的实验内容补齐!


实验三 基于Jess的专家系统设计实验(10学时)正确完成给25分一、实验目的1、掌握利用Jess进行知识表示和推理的方法。2、掌握Jess编程技巧。二、实验要求(任选一题)1. 假设一个交易系统:客户提出要买的东西,卖家提供要卖的东西,如果有符合的,就成交。 试编使用Jess实现该专家系统,并给出Jess程序。2.试用Jess编程实现一个具有学习功能的动物识别专家系统。三、实验设备计算机,Jess教学软件。四、实验内容及步骤(一)题目1的实验内容:下面内容请同学自己补充!提示:1. 第一条规则如果来了新的客户,取得这个客户所有需要的商品,并产生新的事实。(defrule query-buyer?fact <- (new-buyer ?buyer)            ; if there is a new a buyer...=>(retract ?fact)(foreach ?i (nth$ 2 (send ?buyer "GetProducts"))    (assert (requires ?buyer ?i))      ; get the products the buyer requires                                       ; andfor each one create a fact                                       ;associating the buyer and the product   )) 例如,来了一个客户Danny,我们先assert(new-buyerdanny) ,jess发现了这条事实后,触发query-buyer这个规则,注意所有的规则之间没有顺序性。query-buyer这条规则先撤销刚才的事实,避免死循环,然后调用一个函数取得用户所有需要的商品Send ?buyer "GetProducts".例如得到的结果是(Computer Keyboard Mouse),然后规则遍历这个结果集,每一个商品都产生一个新的事实,例如assert requires Danny Computer等等。2. 第二个规则,出现一个新卖家,原理和刚才一样(defrule query-seller?fact <- (new-seller ?seller)          ; if there is a new seller...=>(retract ?fact)(foreach ?i (nth$ 2 (send ?seller"GetProducts"))    (assert (provides ?seller ?i))       ; get the products the seller provides                                       ; andfor each one create a fact                                       ;associating the seller and the product   )) 3. 最后一个是交易的规则 当有买家购买一个商品,卖家卖一个商品,并且两者相同的事实时候,告诉卖家有人要买该物品,同时也告诉买家有卖家投递该物品 (defrulematch-buyer-and-seller(requires ?buyer ?product1)            ; the buyer requires product1(provides ?seller ?product2)         ; the seller provides product2(test (eq ?product1 ?product2))      ; product1 and product2 are the same=>(send ?seller "Order"?product2)       ; order from the seller(send ?buyer "Delivery"?product1)   ; deliver to the buyer) (二)题目2的实验内容1. 判定树图 1 动物识别判定树左分支
本系统的多叉判定树的左、右分支分别如图1、2所示。判定树的叶结点代表能从树派生出来的所有可能的解决方案。这些结点称为答案结点,树上所有其他结点则被称为判定结点。每个判定结点代表一个问题或判定。当回答问题或作判定时,它决定选取一个合适的判定分支继续下去。在简单的判定树中,问题可以是“yes”或“no”的问题。例如:“该动物有奶或有毛发吗?”如果回答是“yes”,则结点的左分支代表继续路径;如果回答是“no”, 则结点的右分支代表继续路径。图 2 动物识别判定树右分支
该判定树具有23个结点,如下表列出:
nameType作用
rootDecision判断是否哺乳动物
node1Decision判断是否肉食动物
node2Decision判断是否鸟类
node3Decision判断是否蹄类动物
node4Decision判断是否鸵鸟
node5Decision判断是否金钱豹
node6Decision判断是否企鹅
node7Decision判断是否虎
node8Decision判断是否信天翁
node9Decision判断是否长颈鹿
node10Answer答案是鸵鸟
node11Decision判断是否斑马
node12Answer答案是企鹅
node13Answer答案是金钱豹
node14Answer答案是信天翁
node15Answer答案是虎
node16Answer答案是未定义的鸟类
node17Answer答案是长颈鹿
node18Answer未定义的动物
node19Answer答案是斑马
node21Answer答案是未定义的哺乳动物
node23Answer答案是未定义的肉食动物
node25Answer答案是未定义的蹄类动物

有时,一棵判定树通过学习在其中添加新的知识是非常有用的,动物识别判定树就是这样。一旦判定树已得到答案,它就问答案是否正确。如果正确,则不须再做什么了。然而,如果答案不正确,那么,判定树将被修改以得出正确的答案。包含一个问题的判定结点将代替答案结点,所包含的问题不同于原来这个结点上的旧答案和没有被猜中的答案。2.遍历判定树遍历树得到答案结点的过程是十分简单的。推理过程以设置判定树的当前结点为根节点开始。若当前位置为一判定结点,则必须以某种方式回答与该判定结点相联系的问题(一般由人来询问判定树)。如果答案为“是”,则当前位置将被设置为同当前位置的“是”分支(或左分支)相联系的子结点。如果答案是“否”,则当前位置将被设置为同当前位置的“否”(或右)分支相联系的子结点。如果在任意点,答案结点成为当前结点,则此答案结点的值就是询问该判定树所得的答案。否则,处理判定结点的过程将重复进行,直至到达一个答案结点。一旦判定树已得到结点,它就问答案是否正确。如果正确,则不须再做什么。然而,如果答案不正确,那么,判定树将被修改以得出正确的答案。包含一个问题的判定结点将代替答案结点,所包含的问题不同于原来这个结点上的旧答案和没有被猜中的答案。这样下去,判定树可学到越来越多的信息。用这种方式学习的一个缺点是,在猜测适当的动物中,判定树最后不会很有层次或很有效率。一棵有效的判定树从根结点到答案结点的所有路径应具有基本相同的分枝数。    遍历判定树的工作过程如图3所示:图3 遍历判定树的工作流程图    关于这个具有学习能力的算法的伪代码如下:       procedure Solve_Tree_and_Learn            Set the current location in the tree tothe root node         while the current location is a decision node do         Ask the question at the current node.         if the reply to the question is yes         Set the current node to the yes branch.         else          Set the current node to the no branch.         end if       end do       Ask if the answer at the current node is correct.       if the answer is correct         Return the correct answer.       else          Determine the correct answer.         Determine a question which when answered yeswill distinguish the answer at the correctnode          from the correct answer.         Replace the answer node with a decision node         that has as its no branch the current          answer node and as its yes branch an         answer node with the correct answer.         The decision node’s question should be         the question which distinguishes the          two answer nodes.       end if   end procedure完成这个算法需要的11条规则,将在系统实现部分详细给出。
名称作用
Initialize对判定树程序进行初始化
ask-decision-node-question输出问题、询问答案
proceed-to-yes-branch使左结点称为当前结点
ask-if-answer-node-is-correct输出结论、询问是否正确
answer-node-guess-is-correct答案正确、是否继续
ask-try-again询问是否重试
one-more-time恢复根结点为当前结点
answer-node-guess-is-incorrect答案错误、开始学习
replace-answer-node替换错误结点
表2 主要规则列表



页: [1]
查看完整版本: Visual Prolog运行环境实验