tuProlog分析

上传人:飞*** 文档编号:47448024 上传时间:2018-07-02 格式:PDF 页数:4 大小:177.48KB
返回 下载 相关 举报
tuProlog分析_第1页
第1页 / 共4页
tuProlog分析_第2页
第2页 / 共4页
tuProlog分析_第3页
第3页 / 共4页
tuProlog分析_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《tuProlog分析》由会员分享,可在线阅读,更多相关《tuProlog分析(4页珍藏版)》请在金锄头文库上搜索。

1、Prolog 编译原理ch(DTCOUNTRY). ls(X, Y):-ch(X), vl(X, Y), ct(X, _, Y, _).:-ls/2,ct/4vl/2ch/1headerbodyclauseClauseInfoDynamicDBasels/2FamilyClausesList:-ch/1true/0 headerbodyclauseClauseInfoch/1FamilyClausesListDTCPU/0XY_1_2TheoryManagerdynamicDBase :上面的结构图就是该部分的内容,存放外部动态定义的谓词逻辑和数据; staticDBase :存放系统预先定义

2、的谓词逻辑和数据; call(G):-call_guard(G),$call(G). java_catch(JavaGoal,List,Finally):-call(JavaGoal),call(Finally). engine :指向当前正在执行的Prolog Engine primitiveManager:主要存放预先定义的Library 、Directive 、Predicate 、Functor startGoalStack lastConsultedTheory:主要存放初始装载进来的逻辑tuProlog 的 primitiveManager主要管理下面的4 种东东: “, ”、“:

3、 - ”、“:-”库(Library) :IOLibrary 、BasicLibrary 、JavaLibrary 、ISOLibrary 指令 (Directive) :$load_library/1 、op/3 、 。 。 。 、load_library/1 、include/1 谓词 (Predicate) :agent/2 、$tolist/2 、add_theory/1 、 。 。 。 、spy/0 函子 (Functor) :expression_bitwise_shift_right/2、cos/1 、float/1 、 。 。 。 、+/2 对 tuProlog的调试过程分析:

4、ch(X),vl(X,Y).1、 将“ch(X),vl(X,Y).” ,转换为 Struct,转换后的Struct结构就为“,(ch(X),vl(X,Y)” ;如果输入“ch(X).” ,转换后的Term 为“ch(X)” ;2、 以上面的 Struct为参数,调用Prolog.solve(Term) 3、 调用 EngineManager.solve(Term) 检查谓词“ ,/2 ”是否包含在:指令(Directive) 、谓词 (Predicate) 、函子 (Functor) ;如果包含,将对应的PrimitiveInfo设置到输入Struct的 primitive属性 中;4、 ne

5、w 一个 Engine(EngineManager, Term)对象,以上面的环境作为输入参数Engine对象的作用相当于Session ,用来全权管理这个查询输入、中间数据、下次查询的入口和输出EngineManager对象用来管理这次Engine过程中环境,但是一个EngineManager只能够管理一个Engine ,在多线程环境下会有问题EngineManager Prolog - ( this) TheoryManager PrimitiveManager LibraryManager Engine - ( this) INIT= new StateInit(this); GOAL_

6、EVALUATION= new StateGoalEvaluation(this); EXCEPTION = new StateException(this); RULE_SELECTION = new StateRuleSelection(this); GOAL_SELECTION = new StateGoalSelection(this); BACKTRACK= new StateBacktrack(this); END_FALSE= new StateEnd(this, FALSE); END_TRUE= new StateEnd(this, TRUE); END_TRUE_CP= n

7、ew StateEnd(this, TRUE_CP); END_HALT= new StateEnd(this, HALT); Prolog、 Engine 、State也会参考对应的EngineManager5、 Engine.run(),从这开始Engine就启动有限状态机(Finite State Machine)开始对 Theory进行unify,直到找到一个结果nextState:存放当前的状态机,当nextState是StateEnd对象时,退出轮询,返回结果Engine.query = ,(ch(X),vl(X,Y)a、 Goal :StateInit,主要作用是为Engine准

8、备ExecutionContext环境,存放在属性currentContext上,在下个状态机时使用Engine.startGoal =,(ch(X_e0),vl(X_e0,Y_e0) Engine.goalVars = X=X_e0, Y=Y_e0 Engine.currentContext.clause = ,(ch(X),vl(X,Y) Engine.currentContext.depth = 0 Engine.currentContext.goalToEval = ch(X_e0), vl(X_e0,Y_e0) /SubGoalStore,用来获取goalsToEval的每个 Sub

9、Goal Engine.currentContext.haveAlternatives = false 设置 nextState为 Call :StateGoalSelection manager.spy(action, this); / 向相关的监听发送消息b、 Call :StateGoalSelection,对输入的Struct的每个谓词进行分离,设置ExecutionContext的 currentGoalEngine.currentContext.currentGoal = ch(X_e0) / 从 Engine.ExecutionContext.goalsToEval.fetch(

10、)中获取 SubGoal if curGoal is not Struct, Engine.nextState = END_FALSE 这样就根据谓词的先后顺序来分别进行unify;设置 nextState为 Eval :StateGoalEvaluation c、 Eval :StateGoalEvaluation,识别currentContext.currentGoal是否是 Primitive Struct,如果不是,直接转往Init:StateRuleSelectiond、Init:StateRuleSelection,为 currentGoal = ch(X_e0)进行事实 (fac

11、t)/规则(rule)匹配ClauseStore clauseStore = ClauseStore.build(goal, varsList, EngineManager.find(goal); / 从 EngineManager中 find所有能够与 currentGoal匹 配的事实 (fact) ClauseInfo clause = clauseStore.fetch(); /ch(ICCPU):-true.取出第一个 Matched 事实 (fact)/规则 (rule)/ 切换 Engine.currentGoal,因为上面的Match Result有可能是事实 (fact),也

12、有可能是 规则 (Rule);如果是规则则必须进一步进行事实匹配,因此这是一个递归的过程,所以需要切换 Engine的当前 ExecutionContext。Engine.new_currentContext.clause = :-(ch(ICCPU),true) Engine.new_currentContext.depth = Engine.currentContext.depth+1 Engine.new_currentContext.goalToEval = true Engine.new_currentContext.haveAlternatives = true Engine.ne

13、w_currentContext.fatherCtx = Engine.currentContext Engine.new_currentContext.fatherGoalId = vl(ICCPU,Y_e0) Engine.new_currentContext.fatherVarsList = X_e0 / ICCPU Engine.new_currentContext.headClause = ch(ICCPU) - - Engine.currentContext.trailingVars = X_e0 / ICCPUe、 Call :StateGoalSelection,对新的 cur

14、rentContext重复前面的步骤Engine.new_currentContext.currentGoal = truef 、 Eval :StateGoalEvaluation,识别new_currentContext.currentGoal是不是Primitive Struct由于当前的 currentGoal = true,是Primitive Struct(系统内部的Struct),因此 转入到系统内部的处理Engine.nextState = PrimitiveInfo.evalAsPredicate(e.currentContext. currentGoal) ? c. GOAL_SELECTION : c. BACKTRACKg、 Call :StateGoalSelection h、TRUE_CP :

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号