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推理引擎本身,这是他们的知识基础结构,量身定制,以验证机深层搜索目标。

Visual Prolog 的 Web 专家系统 (8)的更多相关文章

  1. Visual Prolog 的 Web 专家系统 (1)

    用Prolog敲代码,感觉舒坦. Prolog的编程范式,抽象程度远高于中.低级别的C语言等.敲代码的源码长度,至少比C语言的节省50%. 并且,Prolog的语法简单,符号选择自然合理,养眼度远高于 ...

  2. Visual Prolog 的 Web 专家系统 (7)

    GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...

  3. Visual Prolog 的 Web 专家系统 (9)

    GENI的核心 -- 推理机(3)一些谓词 为了集中注意力.较好地分析GENI推理机核心程序,应该做些准备工作,弄明确一些起辅助作用的谓词功能. is_htmlfile(Rulexpl) is_htm ...

  4. Visual Prolog 的 Web 专家系统 (6)

    保存用户响应询价.作为进一步推理的条件 或GOAL段开始.最初的一句是write_startform() write_startform():- write("<form action ...

  5. Visual Prolog 的 Web 专家系统 (10)

    GENI的核心 -- 推理机(4)求证过程分析 1.GENI知识库结构 专家系统推理机的设计执行,与其知识库结构紧密相关. GENI知识库结构是一棵逻辑推理树. 根节点是animal,即求证的目标. ...

  6. Visual Studio 2013 Web开发

    cnbeta新闻:微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Ser ...

  7. VSS提示"Could not find the Visual SourceSafe Internet Web Service connection information for the specified database

    转自:http://www.cnblogs.com/qqflying/archive/2007/12/18/1004051.html VSS连接错误提示: ====================== ...

  8. Visual Studio的Web Performance Test提取规则详解(3)

    总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...

  9. Visual Studio的Web Performance Test提取规则详解(2)

    总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...

随机推荐

  1. Git本地分支版本号过低导致的push错误 error: failed to push some refs to ... 及兴许amend

    今天在用git的时候遇到了一个问题.在想远程分支push的时候,出现了以下的错误: ! [remote rejected] master -> refs/for/master (change 1 ...

  2. openfire数据库中文乱码问题

    1.首先数据库的编码设置为UTF-8 2.项目的编码也要设置为UTF-8 假设数据保存到数据库的时候还有乱码  就要改动openfire配置文件 在openfire主文件夹\conf\openfire ...

  3. boost::thread类

    前言 标准C++线程即将到来.预言它将衍生自Boost线程库,现在让我们探索一下Boost线程库. 几年前,用多线程执行程序还是一件非比寻常的事.然而今天互联网应用服务程序普遍使用多线程来提高与多客户 ...

  4. HTTP协议和web工作原理

    本章学完之后能干什么? 要把 知识点学好,那就需要把它相关的周边知识点了解全面 HTTP协议是web学习的核心!!! 学东东切忌只学配置,不学原理:只学会框架有什么用,要会自己写框架!! web学习直 ...

  5. 九度OnlineJudge之1014:排名

    题目描述:     今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的考生,并将他 ...

  6. 用log(N)的解法实现数值的整数次方

    // // main.m // c++test // // Created by andyyang on 6/3/13. // Copyright (c) 2013 andyyang. All rig ...

  7. 一步一步实现FormsAuthentic验证登录

    本文不讲原理,只讲用法,原理性的东西网上特别多,不过还是会对一些要用到的东西进行解释,不深入讲原理.本文中用的是Vs2012   .net mvc 4.0.原理看这篇文章,看完这个文章绝对受益匪浅. ...

  8. 使用 PyCrypto 进行 AES/ECB/PKCS#5(7) 加密

    东篱 使用 PyCrypto 进行 AES/ECB/PKCS#5(7) 加密 2013/06/05 · tech PyCrypto 是流行的 Python 加密/解密库.但是其 AES 的 ECB 模 ...

  9. [置顶] Java字节码文件剖析

    Java为什么能够支持跨平台,其实关键就是在于其*.class字节码文件,因为*.class字节码文件有一个统一标准的规范,里面是JVM运行的时需要的相关指令,各家的JVM必须能够解释编译执行标准字节 ...

  10. asp于Server.MapPath用法

    总是忘记Server.MapPath的用法,以下记录了,以后使用: 总注:Server.MapPath获得的路径都是server上的物理路径,也就是常说的绝对路径 1.Server.MapPath(& ...