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,如需转载请自行联系原作者


相关文章
|
11月前
|
JSON JavaScript 前端开发
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。
697 0
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
304 4
基于Django的深度学习视频分类Web系统
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
602 0
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
构建互联网高性能WEB系统经验总结
228 16
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要
211 2
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
548 2
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
470 2
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
351 5
|
API 数据库 开发者
解锁Web2py新境界!揭秘如何利用神秘插件系统,让你的Web项目瞬间起飞?
【8月更文挑战第31天】Web2py是一款轻量级且功能全面的Python Web框架,其插件系统允许开发者在不修改核心代码的情况下扩展框架功能,提升项目灵活性和可扩展性。本文介绍如何利用Web2py插件系统增强Web项目,包括插件的优势、选择与安装方法,并通过集成身份认证插件的具体示例展示其应用过程。通过合理利用插件,可以显著提高开发效率和用户体验。
288 1
|
缓存 NoSQL 数据库
Web服务器与数据库优化:提升系统性能的最佳实践
【8月更文第28天】在现代的Web应用中,Web服务器与后端数据库之间的交互是至关重要的部分。优化这些组件及其相互作用可以显著提高系统的响应速度、吞吐量和可扩展性。本文将探讨几种常见的优化策略,并提供一些具体的代码示例。
490 1