保存用户响应询价。作为进一步推理的条件

或GOAL段开始。最初的一句是write_startform()

write_startform():-
write("<form action=\"\cgi-bin\geni.exe\"method=\"post\">\n").

注意!上一句应为write("<form action=\"geni.exe\"method=\"post\">\n").

GENI虚拟主机没有“cgi-bin”这个子文件夹。

在GOAL中,紧跟上一句的是assert_conditions(ParmList1)

  assert_conditions([]):-!.
assert_conditions([parm(Name,Val)|Rest]):-
concat("cond_",CondNumberStr,Name),
str_int(CondNumberStr,COND),
!,
assert_cond(COND,Val),
assert_conditions(Rest).
assert_conditions([_Parm|Rest]):-!,
assert_conditions(Rest).
assert_conditions(_):-
errorexit.

Prolog没有C语言的for,while等处理循环的机制。

本例,Prolog是用递归来实现“循环”。

谓词assert_conditions的4个子句,表现了典型的、标准的递归应用。

子句1,设置递归终止条件。

终止条件是要处理的列表为空。

子句2,处理列表头,即列表第1个成员。

子句3。忽略要处理的列表头,继续处理剩余表尾。

子句4,准备出错后的处理。

子句4运行的前提条件是:

1、子句1头部匹配不成功,或者。“截断”! 之前的语句失败。

2、而且,子句2头部匹配不成功。

详细是哪个语句失败,以及失败的原因。待以下分析。

子句2和子句3,末尾的语句都是自身的递归调用。

这就是尾递归。

尾递归的优点。是能够无限递归下去,不会耗尽内存。

看看子句1中的语句吧。

concat("cond_",CondNumberStr,Name)

它是内建谓词,流模式是(i, i, o), (o, i, i), (i, o, i), (i, i, i)

用于连接2个字符串

本例的流模式是 (i, o, i)。从变量名上看,CondNumberStr应该是数字

所以。若Name="cond_3" ,则CondNumberStr=3

这时,能够试试上一节的小伎俩:

在VDE中。菜单File|New,出现一空白文件noname.pro。写入:

goal
concat("cond_",A,"cond_1").

菜单Project|Test Goal。目标编译运行。结果:

A=1
1 Solution

再看下一条语句

str_int(CondNumberStr,COND)

这是个内建谓词:str_int (STRING StringArg, INTEGER IntArg)
流模式是(i, o), (o, i), (i, i)
用于字符串与整数的相互转换
建议用上述小伎俩试一试

这一句之后,便是截断"!"。由此可见,引起子句2回溯到子句3的条件是:

1、变量Name不是以“Cond_”开头的字符串,或者,
2、变量CondNumberStr不是数字字符串。

这一回溯引起子句3的运行,结果是忽略当前处理对象,開始新的递归,

处理列表中的后序对象。

继续往下看:

assert_cond(COND,Val)

  assert_cond(CNO,"yes"):-!,assert(yes(CNO)).
assert_cond(CNO,"no"):-!,assert(no(CNO)).
assert_cond(_CNO,"why"):-!,assert(whymeet).
assert_cond(_,_):-errorexit.

CNO是知识库里“条件”的标识号

yes(CNO),no(CNO),保存在事实库tmp里。

意思是:对第CNO号条件,回答了yes/no

whymeet,也是保存在事实库tmp里,

意思是:用户要求系统答复。为什么询问这一问题。

最后一句,assert_conditions(Rest).

递归处理列表的尾巴Rest。

今天的重点是尾递归,也是Prolog一个主要特征。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

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

  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 专家系统 (8)

    GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...

  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. Galaxy (hdu 5073 数学)

    Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total S ...

  2. 京东评论情感分类器(基于bag-of-words模型)

    京东评论情感分类器(基于bag-of-words模型) 近期在本来在研究paraVector模型,想拿bag-of-words来做对照. 数据集是京东的评论,经过人工挑选,选出一批正面和负面的评论. ...

  3. java表达式陷阱

    以下是一些常见的面试java问题的表达,我将造成直接的形式附加目光. 问题1: int a = 10; int b = a + (a = 5) + a + (a = 10); System.out.p ...

  4. win8.1 64位环境建设android开发环境

    1.下载JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html,选择版本号 2.安装刚刚下载的JDK 3.环境变量 ...

  5. Java Web整合开发(附录1) - 安装配置环境

    1. Install JDK http://blog.csdn.net/sonnet123/article/details/9169741 Download JDK http://www.oracle ...

  6. 桥模式设计模式进入Bridge

    Abstraction:抽象部分的父类,定义须要实现的接口. 维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstracti ...

  7. CSDN 夏令营课程 项目分析

    主题如以下: 正确改动后的程序: #include <iostream.h> //using namespace std; class BASE { char c; public: BAS ...

  8. poj 1384 Piggy-Bank(全然背包)

    http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...

  9. java提高篇(十二)-----equals()

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

  10. CodeForces 22D Segments 排序水问题

    主题链接:点击打开链接 升序右键点.采取正确的点 删边暴力 #include <cstdio> #include <cstring> #include <algorith ...