zoukankan      html  css  js  c++  java
  • Visual Prolog 的 Web 专家系统 (8)

    GENI核心 -- 推理引擎(2)流量控制

    1、阐述fail、“!”而回溯

    与其他语言相比,,Prolog最大的特点。这是回溯机制。

    回溯机制,还有的主要手段2个月,首先,通过使用谓词fail触发回溯,特别谓词“!”(读作cut)取消回溯。

    Prolog运用fail引发回溯。实现程序的循环,并运用“!”对回溯进行控制。

    看一个典型演示样例:

    FACTS
    	f(integer)
    PREDICATES
    	a()
    	b()
    	c()
    CLAUSES
    	a():-
    		write("------ a -------
    "),
    		f(X),
    		writef("%
    ",X),
    		fail.
    	a():-
    		write("a is sucsess.").
    %---------------------------------------------------------
    	b():-
    		write("
    
    ------- b -------
    "),
    		f(X),
    		writef("%
    ",X),
    		!,
    		fail.
    	b():-
    		write("b is sucsess.").
    %---------------------------------------------------------
    	c():-
    	        write("
    
    ------- c -------
    "),
    		a(),
    		b(),
    		!,
    		write("
    c sucsess.").
    	c():-
    		write("
    c backtracking.
    
    ").
    %---------------------------------------------------------
    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 -------
    "),
    		f(X),
    		writef("%
    ",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推理引擎本身,这是他们的知识基础结构,量身定制,以验证机深层搜索目标。

  • 相关阅读:
    初步学习“C#中is,as用法”(转载)
    SQL 语句性能调优
    算24点,给出四个数字,算出所有组合
    企业信息化实施先松后紧
    解决Json的DateTime格式问题
    Hadoop安装记录
    Test Blog by using windows live writer
    EL表达式获取对象属性的原理
    spring配置文件中配置sessionFactory失败
    Visual Studio 使用Web Deploy 3.6发布项目
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5034077.html
Copyright © 2011-2022 走看看