Visual Prolog 的 Web 专家系统 (6)

简介:

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

或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一个主要特征。

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




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4656415.html,如需转载请自行联系原作者


相关文章
|
1月前
|
前端开发 JavaScript Java
计算机Java项目|基于web的铁路订票管理系统
计算机Java项目|基于web的铁路订票管理系统
|
2月前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
1月前
|
传感器 小程序 搜索推荐
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
通过电子班牌设备和智慧校园数据平台的统一管理,在电子班牌上,班牌展示、学生上课刷卡考勤、考勤状况汇总展示,课表展示,考场管理,请假管理,成绩查询,考试优秀标兵展示、校园通知展示,班级文化各片展示等多种化展示。
50 0
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
|
1月前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
2月前
|
开发框架 缓存 前端开发
利用Visual Basic构建高效的ASP.NET Web应用
【4月更文挑战第27天】本文探讨使用Visual Basic与ASP.NET创建高效Web应用的策略,包括了解两者基础、项目规划、MVC架构、数据访问与缓存、代码优化、异步编程、安全性、测试及部署维护。通过这些步骤,开发者能构建出快速、可靠且安全的Web应用,适应不断进步的技术环境。
|
15天前
|
算法 计算机视觉 C++
web 丨 nft 元宇宙链游项目系统开发模式逻辑详细(成熟源码)
一、什么是元宇宙? 元宇宙指的是通过虚拟增强的物理现实,呈现收敛性和物理持久性特征的,基于未来互联网,具有链接感知和共享特征的 3D 虚拟空间。 大概可以从时空性、真实性、独立性、连接性四个方面交叉描述元宇宙:
|
1月前
|
数据库 数据安全/隐私保护 Python
Web实战丨基于Django与HTML的新闻发布系统(二)
Web实战丨基于Django与HTML的新闻发布系统(二)
29 1
|
1月前
|
存储 数据库 数据安全/隐私保护
Web实战丨基于Django与HTML的新闻发布系统
Web实战丨基于Django与HTML的新闻发布系统
28 1
|
1月前
|
存储 搜索推荐 数据库
Web实战丨基于Django与HTML的用户登录验证系统
Web实战丨基于Django与HTML的用户登录验证系统
35 1
|
29天前
|
监控 Python 缓存
缓存系统提升Web应用性能
【6月更文挑战第22天】
23 0