Visual Prolog 的 Web 专家系统 (8)
2015-12-09 20:17
239 查看
GENI核心 -- 推理引擎(2)流量控制
1、阐述fail、“!”而回溯
与其他语言相比,,Prolog最大的特点。这是回溯机制。回溯机制,还有的主要手段2个月,首先,通过使用谓词fail触发回溯,特别谓词“!”(读作cut)取消回溯。
Prolog运用fail引发回溯。实现程序的循环,并运用“!”对回溯进行控制。
看一个典型演示样例:
FACTS f(integer) PREDICATES a() b() c() CLAUSES a():- write("------ a -------\n"), f(X), writef("%\n",X), fail. a():- write("a is sucsess."). %--------------------------------------------------------- b():- write("\n\n------- b -------\n"), f(X), writef("%\n",X), !, fail. b():- write("b is sucsess."). %--------------------------------------------------------- c():- write("\n\n------- c -------\n"), a(), b(), !, write("\nc sucsess."). c():- write("\nc backtracking.\n\n"). %--------------------------------------------------------- GOAL assert(f(1)), assert(f(2)), assert(f(3)), c().
在VDE中,菜单选:File|New,新建一文件noname.pro,把上边的代码贴进去
菜单选:Project|Test Goal,
执行结果。输出显演示样例如以下:
------- c ------- ------ a ------- 1 2 3 a is sucsess. ------- b ------- 1 c backtracking. yes
程序非常easy,GOAL先把事实f(1)、f(2)、f(3)入库,接着求证c()。
Prolog把“函数调用”称作“求证(query)子目标”。
并不是Prolog矫情。别的“小语种”基本如此。
比方。函数语言Lisp、Erlang等,把“函数调用”称作“求值(evaluate)“。
还得说说”子目标“。
从理论上说,Prolog程序,由一个总目标和多个子目标构成,形成”树“逻辑关系。
GOAL是总目标,即树的根结点,子目标则是树的各层枝叶。
在本演示样例中,总目标的子目标是c(),而a(),b()则是c()的子目标。
在a()和b()中,子目标是f(X)。
这段演示样例代码的看点,主要是fail和!。
write(),writef()等管理输入输出的谓词,不是子目标。由于,它们不參与求证、推理。
要正确理解谓词子句体内子目标的关系。逗号”,“是关键。
逗号”,“的含意,是逻辑”与“,and。因此。子句体实际上是个复合逻辑推断:
比如,子句 a():- b(),c(),d(). 相当于: if a() then { if (b() and c() and d()) then a() }
这里并没写错,子句头与子句体就是这种逻辑关系。
不仅如此,分号”;“表示逻辑”或“。
比如。本例的谓词a(),2个子句能够合并写成这样:
a():- write("------ a -------\n"), f(X), writef("%\n",X), fail ; write("a is sucsess.").
仅仅是,用分号”,“而非并列子句表示逻辑或,会造成代码难读、难懂等误会,非常不有用。
所以,在实际编程中,差点儿见不到使用分号”;“的。
如今再回到GENI的推理机流程控制这个话题上来。
上面提到的“典型演示样例”,是GENI的推理机流程控制的方法之中的一个。
当中,谓词a()中的fail,遍历了所有f(X)。
谓词b()中的 !,fail。仅仅取得第一个f(X),而且不再回溯。
谓词c()中的 ! 也非常重要。
没有它。程序编译时就会出错。
2、Prolog以先深搜索的方式求证子目标
Prolog本身就是以先深搜索的方式求证目标的推理机。仍以上面的“典型演示样例”说事。
a(),b()。c()等三个谓词,分别都是由2个子句构成的逻辑或,or 的关系。
它他们体内条款。构成逻辑和。and 关系。
按照逻辑操作的优先级的规则。第一and后or。
然后,证明的方式来形成目标深度优先搜索。
GENI知识库rule,按道理“树”关系,与Prolog完全一致的推理机制。
和GENI推理引擎本身,这是他们的知识基础结构,量身定制,以验证机深层搜索目标。
相关文章推荐
- centos7 minimal connect: Network is unreachable
- Tomcat部署Web应用
- 解决hibernate方言问题
- 关于定时器的cron表达式
- 网络层—路由器的构成
- 25个最好的免费Eclipse插件
- jQuery实现选项卡切换效果简单演示
- leetcode Longest Consecutive Sequence
- 开发工具之Eclipse快捷键
- 自定义drawable实现圆角图片
- Android layer type与WebView白屏以及WebView不随动画而动的问题
- 使用python编写appium用例
- JS 问题集锦
- LaTeX新人教程,30分钟从完全陌生到基本入门
- 用idea编写appium用例
- 使用Struts 2框架实现文件下载
- MIME-TYPE
- POJ 1979 Red and Black(红与黑)
- android常见错误
- C语言学习笔记(20) 数组参数和指针参数分析