AMZI! PROLOG白皮书

一、Amzi! Prolog+ 逻辑服务器概述

Amzi!架构体系使用示例详细的说明,如何使用Amzi!逻辑服务器将Amzi! Prolog与传统的编程语言集成在一起。

 

二、规则、Prolog及Amzi!

规则、及它们与应用程序逻辑的关系,以及Prolog如何容易的实现基于规则的应用程序。

 

三、逻辑知识概述

关于过程、事实、逻辑知识之间关系的讨论,以及虚拟机是如何实现逻辑知识应用程序的关键。



一、Amzi! Prolog + 逻辑服务器 ™


  Amzi! Prolog +逻辑服务器可以很容易地将基于规则的组件与Windows、Linux、SunSolaris、HP/UX和其他应用程序集成在一起(见下面的列表)。

基于规则的组件

  • 产品和服务的配置和定价规则,
  • 政府规定的行业, 
  • 提交表格的法律和税收规则,
  • 最佳客户服务的工作流程规则,
  • 解决问题的诊断规则, 
  • 与数据库集成检测规则,  
  • 文档语法规则, 
  • 使用性能敏感的应用程序调优规则, 
  • 使用帮助系统的咨询规则, 

·       商业规则与任何商业应用程序。

      Amzi!为C、C++、Java、Web Servers(通过 ASP.NET、JSP、Java Servlets、CGI)、Delphi、VB.NET、C#.NET、PowerBuilder、Access、Excel和许多其他工具提供了插件,及基于规则的服务。

      集成是通过“逻辑服务器API” (LSAPI)实现的,它允许您像今天访问数据库一样轻松地访问规则的逻辑库。其结果是一个可管理且行为良好的接口,使得在需要的任何地方都可以运用基于规则的编程(见图)。

       除了启用嵌入式Prolog应用程序之外,逻辑服务器API(LSAPI)也允许您扩展Amzi!Prolog,以便于Prolog谓词可以访问你的数据,调用您的代码并链接到其他库和接口。

“多年来,我一直在寻找使用这种API的Prolog ……, 它被设计成以两种方式同时工作(可嵌入的和可扩展的), ...... ,它很小,但似乎很完整。”

Jonas Beckman, MU Data

最先进的交互式开发环境

    Amzi! 提供了经典的Prolog命令行工具,以及一个完整的交互式开发人员环境(IDE),基于开源的 Eclipse 项目,在一个直观的GUI环境中集成了一个code editor(代码编辑器)、listener(监听器)、debugger(调试器)、compiler(编译器)、linker(链接器)和runtimeengine(运行时引擎)(参看屏幕截图)。

Amzi! 工具

  • Amzi! Eclipse IDE. 
  • 完整的在线文档和教程。
  • 源代码调试器。
  • 标准?-侦听器同时运行编译和解释代码。 
  • 盒模型调试器(由Clocksin & Mellish定义)。 
  • 编译器。
  • 连接器。
  • 明确的子句文法 (DCG)(对自然语言工作的支持)。

·       动态(DLL,格式)逻辑服务器API库

  Amzi! Eclipse IDE特性:

·      编辑器中的语法着色以突出内置谓词、字符串、注释等。

·      Source fileoutliner and project cross referencer.

·      源代码书签,以指示错误的位置、待办事项、搜索文本等。

·      完整的源代码调试,显示调用栈中每个级别的变量绑定。

·      在其他语言和工具中嵌入已编译的Prolog组件的完整源代码调试,并在远程机器上运行(如Web服务器)。

·      可选包含其他项目的可移植项目。

  • 在Prolog监听器中自动加载库和lsx,以及输入行回忆和编辑。

可能对Amzi!用户有用的Eclipse IDE的其他标准特性:

·      用于开发Java, C++, COBOL, C#, PHP 和其他程序的单独下载的插件。

·      自动文件备份。

·      用于建模、图形编辑和测试的工具。

·      与源代码控制系统的无缝连接,如CVS、Perforce、PVCS、MKS、ClearCase等等。

       与Apache的Ant构建工具紧密集成。

世界级源代码调试器

Amzi!EclipseIDE是源代码调试器的真正的宝石。它结合了传统的调试工具,如breakpoints断点)、pause暂停)、step-into单步进入)和step-over单步完成)选项,非常清晰地展示了像backtracking回溯)、unification合一)和cut切断)这样的Prolog概念。

清晰的学习

当一个程序执行时,源代码的行根据其状态以不同的颜色高亮显示,这使得它非常清晰的通过Prolog源代码来展示Prolog回溯的方法是如何工作的。一个单独的窗口有完整的调用堆栈,并且,在每个级别上执行clause子句)的变量绑定。

对于初级的Prolog程序员来说,这意味着一些困难的谓词,如append/3,变得易懂,从而消除recursion递归)和unification合一)的涟漪效应的表面魔力。

用于生产应用程序的嵌入/远程调试

对于专业人员来说,调试器与编译的生产代码同样有效,它可以用于调试嵌入式Prolog组件,无论是在开发人员的工作站上,还是在单独的机器上远程运行。

这意味着不再需要从集成的应用程序中分离出Prolog代码来对它进行测试和调试。开发人员可以在工作站上为作为远程服务器环境的一部分运行的Prolog组件进行完整的源代码调试。

嵌入逻辑服务

逻辑服务器是作为一个类实现的,LSAPI是类LogicServer的成员函数的集合。LSAPI也被提供为一个纯函数API。您可以访问与数据库相似的逻辑服务器。LSAPI允许您在任何受支持的平台上及Windows下,从任何可调用的DLL工具上加载、查询和更新来自任何语言的规则和数据的Prolog逻辑库。

代码框(下图)演示了一个简单的基于规则的系统,它向用户询问一个声音,从中识别出一个宠物。同样的想法可以用来识别基于症状的问题,基于系统配置的调优参数,基于用户需求的帮助等等。

调用逻辑服务器

下面的程序示例实现以下步骤:

1)   初始化逻辑服务器

2)   加载Pets(宠物)程序

3)   从用户获得的声音

4)   宣称sound到logic-base(逻辑库)

5)   在logic-base(逻辑库)中查询pet(X)

6)   获取X的值 

7)   显示结果

8)   关闭逻辑服务器

. . .从Java和Servlets

ls.Init("");

ls.Load("pets.xpl");

Sound.append("sound('");

System.out.println("What sound?");

while ((c=System.in.read())!=-1) 

    Sound.append((char) c);

Sound.append("')");

System.out.println(Sound.toString());

ls.AssertaStr(Sound.toString());

Term = ls.ExecStr("pet(X)");

Pet = ls.GetStrArg(Term, 1);

System.out.println("Pet is a ");

System.out.println(Pet);

ls.Close();

. . .从VB.NET和ASP.NET

ls.Init("")

ls.Load("pets")

Sound = InputBox$("What sound?")

ls.AssertaStr("sound(" + Sound + ")")

Term = ls.CallStr("pet(X)")

Pet = ls.GetStrArg(Term, 1)

MsgBox "The pet is a " + Pet

Call ls.Close()

. . . 从 C++

Init("");

Load("pets");

puts("What sound?");

gets(Sound);

AssertaStr("sound(%s)",Sound);

CallStr(&term, "pet(X)");

GetArg(term, 1, cSTR. &Pet);

printf("The pet is a %s\n", Pet);

Close();

. . . 从Delphi

ls.InitLS(''); 

ls.LoadXPL('pets');

Sound:=InputBox('','What sound?','');

ls.AssertaPStr('sound('+ Sound +')');

ls.CallPStr(t, 'pet(X)');

Pet := ls.GetPStrArg(t, 1);

ShowMessage('Pet is a ' + Pet);

ls.Close;

 

PETS.PRO

% 3 Prolog rules for 

% identifying pets based 

% on their sound

 

pet(dog) :- sound(woof).

pet(pig) :- sound(oink).

pet(duck) :- sound(quack).

PETS 在侦听器中

?- consult(pets).

yes

?- assert(sound(woof)).

yes

?- pet(X).

X = dog

 

该API有50多个方法/函数,它们提供了对Prolog规则、术语和数据的高级和详细访问。高级函数使用直观的字符串映射函数来模拟Prolog侦听器(请参阅下面的代码框)。

详细的函数允许您构造和/或分解任意复杂的Prolog术语和列表。例如,这个C代码会将Prolog列表中的所有元素都弹出并打印出来:

while(PopList(&Lst,cSTR,S)==OK)

  printf("Popped %s\n", S);

 

“我深信Amzi!的方法对于使用过程语言接口连接Prolog是正确的……。Prolog程序从根本上更接近于数据库,而不是一个顺序程序。因此,API呈现了一个类似于数据库接口的接口……。在我看来,这和一个能够进入到Prolog的接口一样直观。

Amzi!让你对它在Prolog市场的定位有一个独特的看法。它的目标是成为用其它语言编写的应用程序的一个组件。

……可靠地、商业级…理想的嵌入”

PC AI 评论,

Sep/Oct 95

扩展Prolog

Logic Server API(逻辑服务器API)还使得为Prolog实现定制扩展谓词变得更加容易。这些是您自己设计的谓词,它们是在宿主语言中实现的。扩展谓词的外观和行为与内置谓词类似,如read /1和write/1,它们是核心Prolog系统的一部分。

例如,一个调优应用程序可能会使用C++GUI实现它的用户界面,它加载并调用Prolog中编写的调优规则。那些规则是基于机器的状态决定的,这是由Prolog程序直接调用的C函数决定的。

或者,您可能希望您的Prolog代码访问网络服务器。您可以使用Logic Server API让Prolog直接访问网络的API。

扩展谓词可以在任何支持回调函数概念的语言中实现。目前,这意味着c/c++、Java、Delphi、C#和Visual Basic可以用来实现扩展谓词。

“我一直使用Amzi!,它有广泛的C/C++接口,有使用C(++)代码添加Prolog谓词的条款。这太好了。”

Gregg Weismann,系统软件开发经理,Xircom,公司

Internet支持

对于构建互联网应用程序,Amzi!这些特性包括:

  • Java类(如上所述)用于JSP和servlet(包括示例)。.
  • 与微软的ASP.NET交互的.NET类。
  • 一个用于各种internet技术的XML库,包括SOAP。
  • 从内存中加载Prolog组件的能力(从而支持像JAR文件这样的二进制档案)。
  • 用于与客户端和服务器(如邮件、ftp、http)通过Sockets(套接字)进行通信的逻辑服务器扩展。
  • 一个CGI接口,它允许你编写运行在web服务器上的Prolog脚本。

多会话支持

对于构建Internet、电话、数据库和其他服务器应用程序,你可以调用多个同时出现的Amzi!逻辑服务器(Prolog运行时)实例。这些实例可以在自己的线程中随意运行。这允许您为每个用户或进程访问一台服务器创建一个实例。

数据库支持

Amzi! Prolog逻辑库可以从任何ODBC数据库中推断出记录 (Windows下)。这是一个两层的接口,其中一部分实现为LSX【Logic Server eXtension(逻辑服务器扩展)】,它实现了直接访问ODBC服务的扩展谓词;另一部分是作为一个Prolog包装器实现的,它围绕着ODBC谓词,允许自然的Prolog模式匹配和回溯与ODBC数据库一起使用。因为提供了完整的源代码,所以ODBC接口可以很容易地适应其他关系数据库。

Tcl/Tk图形接口

Tcl/Tk是一个强大的、开源的、脚本和图形工具包,作为一个Amzi!LSX (逻辑服务器扩展)被支持。它允许将Tcl/Tk命令嵌入到Prolog中,并允许Tcl/Tk查询Prolog。其结果是一个构建智能图形应用程序的强大组合。

Unicode支持

在内部,Amzi!逻辑服务器是一个纯粹的Unicode标准实现。在外部,它支持Unicode、ANSI和多字节应用程序。 这意味着您可以使用Unicode字符集编写Prolog源代码,并用Unicode字符串调用Logic服务器。因此,Amzi! Prolog可以用任何人类语言进行交流。

面向对象编程

逻辑服务器API的C++、Java、Delphi、C#和VB版本都是作为类传递的,带有LSAPI函数的类被实现为成员函数。这意味着您可以使用这些类为您的应用程序派生子类。然后,这些子类将封装应用程序期望从其自身的Prolog部分中获得的服务,隐藏类中逻辑服务器的详细信息。

例如,宠物识别代码示例可以封装在一个C++对象中,如下面的框中所示。

// 作为C++对象访问Prolog逻辑库

// 从Prolog引擎派生类

class CPets: public CLogicServer {

public:

     Cpets();

     ~Cpets();

     void id(char *, char *); 

};

 

//构造器初始化引擎和加载规则

CPets::CPets { Init(""); Load("pets");}

 

// destructor frees Prolog resources

CPets::~CPets { Close(); }

 

// 鉴别宠物

void CPets::id(char* Sound,char* Pet) 

{

     char  buf[40];

     TERM  term;

 

     sprintf(buf, "sound(%s)", Sound);

     AssertaStr(buf);

     CallStr(&term, "pet(X)");

     GetArg(term, 1, cSTR, Pet); 

}

 

 

     // 使用CPets对象的样本代码

     ... 

     CPets    aPet;

     cout<<"what sound?";

     cin >> Sound;

     aPet.id(Sound, Pet);

     cout<<"The pet is a "<<Pet; 

     ...

 

“结合Visual Basic和逻辑服务器,您可以创建一些程序来利用Prolog的强大功能,而Visual Basic则负责维护接口的所有工作……。创建和调试您的Prolog程序是一件轻松的事……。因为Amzi!的版本是Prolog的标准实现,它可以在大多数Prolog代码的盒子里工作。”

VB科技评论杂志

高性能

在任何应用程序中,性能都是关键。 Amzi! Prolog是一个已编译的Prolog,所以通常你访问的逻辑库将被编译。但是, Amzi! 是灵活的, 因此,您可以使用已编译的代码将动态声明(解释型)代码混合在一起。在PETS宠物)的例子中(上图),规则被编译,声音是动态声明的。

开放式架构

所有的Amzi!- Prolog的书面扩展是使用逻辑服务器API实现的,并带有完整的源代码。您可以使用LSAPI很容易的来设计和编写您自己的扩展。你可以添加你自己的Prolog-数据库,Prolog-GUI, Prolog-通信,等等

您的扩展可以打包成一种特殊类型的动态库(dll/so),称为LSX(逻辑服务器扩展),或者他们可以成为你的程序的一部分。LSX是作为ODBC、Ttcl/Tk和Sockets产品的一部分提供的。

存储器利用

作为一个组件,Prolog既紧凑又行为良好。这使得Amzi!成为24/7在线运营的理想选择。

“Amzi! 提供了如此多的灵活性,在所有的意图和目的中,允许数字和符号计算的混合在几年前是不可能实现的。做得好!”

Jim Morrison,,商业研究助理,ZENECA专业

错误处理

专业的应用程序需要健壮的错误恢复。Amzi!被设计为在错误的情况下优雅地识别和下降。主机程序可以在API调用检索错误代码、消息、调用堆栈、读缓冲区和其它信息中检查错误。程序可以使用捕获/抛出和异常处理程序来捕获和报告所有错误并作出相应的响应。因此,错误可以在您的Prolog逻辑库中被抛出,并在您的Java、C++、VB、C#或Delphi程序中被捕获和处理。

 可移植

在一个平台上开发的Prolog源代码和对象代码将在任何其他运行时或API平台上运行(无需重新编译或重新链接)。这是因为Amzi! 逻辑服务器是通过一个类似于Java和.NET的虚拟机架构实现的,它被称为WAM。 Amzi!编译器和链接器创建二进制字节码文件,它可以由逻辑服务器的任何实现来执行。

Prolog的技术规格

  • 可重用代码和“隐藏”谓词的ISO-标准“模块”功能,以防止跨文件的名称冲突。 
  • 字符串、浮点数、流输入/输出和随机存取二进制文件支持。
  • 完全控制所有堆、栈和各种其他动态分配的项目的大小。 
  • 具有可捕获异常的用户可扩展错误处理。
  • 对动态数据库选项进行排序和索引,以便更快地访问条目。 
  • 最后调用优化(一种更一般的“尾部递归”消除形式)。
  • 第一个参数索引,以获得更有效的谓词访问。
  • 自动垃圾收集堆、栈和字符串空间,以便更有效地使用内存。 

开发的简易性

Amzi!让您一次构建您的应用程序一个模块,因为编译和解释的代码可以在同一个程序中混合。事实上,编译和解释的模块是100%源码兼容的,并且不需要改变从一个移动到另一个。这使得在大型多模块应用程序上工作变得容易,编译了工作代码,代码仍在开发中。

为了让你快点开始,这个包包含了Adventure in Prolog《Prolog中冒险》教程、BuildingExpert Systems in Prolog《在Prolog中建立专家系统》高级教程和许多例子,包括:

·      Hello programs forC, C++, Java, Delphi, Visual Basic, .NET,用于C、C++、Java、Delphi、Visual Basic、.NET的Hello程序

·      A multi-threadedRubik's Cube Solver.一个多线程的魔方解算器》

·      Clocksin &Mellish's Predicate Calculus to Prolog translator (使用实际的符号来表示“存在”,等等。)《Clocksin & Mellish'的谓词演算到Prolog转换器》

·      A simple Japaneseto English translator.一个简单的日语到英语翻译器

·      A genealogicaldatabase implemented with ODBC.使用ODBC实现的系谱数据库

·      A general-purpose,forward-chaining expert system  with abird identification logic-base.一种通用的、正向链的专家系统,具有鸟识别逻辑库。

·      An informationrequest form for a web server.web服务器的信息请求表单。

 

“你们真棒……感谢您提供了优秀的文档化软件!”

Oliver Jones, DotClick 公司

分派

Amzi! 是无版权费的

“联系Amzi!他们的Prolog产品‘with-it'” 

来自comp.lang.prolog新闻组

环境和包装

Amzi! Prolog +逻辑服务器运行在Windows, Linux, Solaris和HP/UX.下 (其他平台与我们联系)。该产品包括完整的HTML文档,大量的样本,以及教程的文本,《Adventurein Prolog》和《Building Expert Systemsin Prolog》。

震撼性开发杂志效率大奖 的组件和库

“决策制定软件在从证券交易到空中交通管制的领域中都能找到,在复杂的条件下做出选择,通常是实时的。

基于规则的系统是这类问题的常见解决方案。

创建基于规则的应用程序的最佳语言之一总是Prolog。

然而,在过去,使用它创建成熟的应用程序是很困难的。

Amzi!公司在Amzi!逻辑服务器中有一个解决方案。

一个可嵌入的Prolog规则基础和推理引擎,可以从C++、Java、Visual Basic、Smalltalk和其他工具中访问。

它的爱丁堡-标准Prolog的实现和跨平台,运行时免版权税 ,Amzi!逻辑服务器应该使那些觉得有必要开发更智能软件的人能够访问基于规则的编程。”

软体开发

 

包括在Amzi!中的 Eclipse IDE,获得了2004年《软件开发》杂志的语言和开发环境震撼奖。



二、关于规则、Prolog和逻辑服务器技术的白皮书


规则是什么?

规则在数据和过程之间占据了一个模糊的区域。和数据一样,规则基础中的每条规则都是独立的,并且可以根据共同的值动态地链接到其他规则。就像过程一样,每个规则都有多个子语句,指定与执行或触发规则相关的条件和/或动作。

从另一个角度来看,数据库和过程都可以被认为是规则基础的退化案例。数据库是一组规则的集合,它们没有动作语句,只有一组条件。过程是一个有许多语句的大规则。图1说明了数据(Data)、过程(Procedure)和规则(Rules)之间的关系。


因为大多数编程工具都是为数据或程序设计的,当面对一个作为规则集合编写的规范时,开发人员面临着一个棘手的问题。这些规则不能用数据来表达,并且在程序上对它们进行编码,即使是最好的程序员也会导致类似于意大利面式的代码。 进一步,原始规则在代码中丢失,变得难以调试,并且在必要时几乎不可能更新。

具有讽刺意味的是,应用程序的这个困难部分通常是它的核心,更糟糕的是,这块儿最有可能改变。

规则是应用程序的核心

考虑一个电话公司的帐单应用程序。大多数应用程序都是使用数据进行干净的编码用于电话、消费者以及处理数据的过程。但是电话定价是一个棘手的部分,基于来自市场营销问题、地方性法规、各种子运营商以及大客户的特殊安排的一组规则的集合,所有这些都是基于时间的预期规则,通话的物理距离、通话时长,以及是否为信用卡、接听人付费或直接付费呼叫。

你所需要做的就是去了解电话计费的重要性,那就是倾听大型电话公司的广告。每个人都声称有更好的定价规则。这些规则的波动性源于竞争环境、不断发展的技术和不断变化的政府法规。

一个困难的基于规则的组件的现象是一个简单的应用程序的核心和灵魂,它的出现是一遍又一遍。考虑保险公司的承保规则、航空公司的调度规则、制造的配置规则、帮助台的诊断规则、银行的贷款批准规则、以及过程控制中的异常处理规则。

那么程序员该怎么做呢?我们需要的是一种语言,它允许您以声明的方式指定规则,(就像在指定系统时所描述的那样),以及将它们与组成大多数应用程序的过程和数据集成的方法。Prolog就是这样一种语言。

Prolog是什么?

Prolog是一种完整的、行业标准的编程语言,非常适合编写规则。因为它是一种完整的语言,Prolog可以用于几乎任何应用程序,但是,和其他语言一样,它也有自己的优点和缺点。然而,Prolog的优点是传统语言的缺点(比如C/C++BasicJava),反之亦然。尽管它可以是并且经常被自己使用,但是Prolog在同一个应用程序中一起使用时,它是对传统语言的补充。

在最简单的情况下,Prolog程序只是一个事实和规则的集合。例如,一个用于视频监视器的技术支持应用程序可能有这些规则。

hypothesis(loose_plug):-

   symptom(screen, dark),

   symptom(video_led, off).

 

hypothesis(blank_screen_saver):-

   symptom(screen, dark),

   symptom(video_led, on).

 

action(push_plug_in):-

   hypothesis(loose_plug).

 

action(move_mouse):-

   hypothesis(blank_screen_saver).

 

第一个规则可以被解读为如果症状屏幕是黑暗的,而症状视频被关闭了,那么假设就是插头松动。与屏幕变暗的用户的交互可能会产生这些事实。

symptom(screen,dark).

symptom(video_led,on).

通过查询“actionX查询这些Prolog规则和事实,将产生结果“action=movemouse”

Prolog并不是一门很难学的语言,但它包含了其他语言中通常不常见的特性。这些特性需要一些时间来适应,但是它们使它成为解决某些类型的难题的特殊语言。

例如,大西洋沿岸联盟ACC)的大学篮球赛季是很难安排的,因为大学篮球在美国是一项大生意,每个队都在争夺一个时间表,为有价值的电视报道提供了良好的机会。过去一年的时间表总是妥协,因为无论是手工方法还是传统的编程方法都不能产生满足每个团队的个人约束和对整体公平的渴望的时间表。

   这是第一年他们有一个满足所有约束条件的时间表,它是由一个Prolog程序生成的。Prolog被证明是一种很有表现力的语言,用于编码问题,以及一种寻找解决方案的有效语言。下面的段落突出了Prolog的特性,它使它非常适合这种类型的应用程序,并以ACC调度问题为例。

 

符号编程

首先,Prolog是一种符号语言,意思是它被设计用来操作符号。例如,4-2是一个复杂的符号,它由三个原始符号组成,在这个例子中是两个整数和一个运算符。如果被问到,Prolog可以用算术来计算这个特定的表达式,但一般来说,它只是一个符号,就像它所写的那样。调度程序利用这个特定的模式来表示游戏,所以4-2被用来表示团队4在第二队的主场比赛。类似地,模式团队(2杜克)被用来将杜克的名字与第2组联系起来。

 

逻辑变量

其次,Prolog使用逻辑变量,与传统的编程变量不同,它采用基于模式匹配符号的值。变量由最初的大写字母表示。例如,在调度程序中,模式X-2中的变量X可以用来识别在队2的主场团队2的所有团队。类似地,team(N,Name)可以用来查找与团队编号相关联的团队名称。

 

强大的搜索和模式匹配

第三,Prolog有一个内置的回溯搜索机制,因此,与传统语言不同的是,执行可以向前和向后。当它向后移动时,逻辑变量就会从它们之前的值中脱离出来,当执行再次启动时,它们就会被绑定到新的值。例如,模式X-Y可以用来从游戏列表中选择游戏,游戏列表看起来像【1-21-3……2-1 2-3……】。如果游戏导致了一个约束违反,回溯将自动导致XY的新值,因为另一种可能的游戏被选中。

 

递归

第四,Prolog使用递归。许多语言支持递归,但是在Prolog许多应用程序中,递归都扮演着重要的角色。广泛用于调度程序。从最顶层的循环中,递归地从可能的游戏列表中选择游戏,在它运行的时候构建一个输出时间表;到在确保问题的约束条件下,遍历各种中间列表,寻找游戏和模式的最低级别谓词。

例如,这个规则递归地遍历一个团队的游戏列表,看看是否有三个客场比赛,这是一个限制犯规。它表示如果在一个团队的日程表中有三场连续的客场比赛,那么客场比赛是正确的。

away_triple([a-_,a-_, a-_|Z]) :- !.

away_triple([_|Z]):-

  away_triple(Z).

高效、便携架构

第五,Prolog是使用沃伦抽象机器(WAM)实现的。对Prolog的简单实现可能是乏味的,因为上面提到的特性并不能自然地映射到当今计算机的底层架构。(相比之下,传统编程语言的控制流和变量表示非常清晰地映射到基本的计算机架构,这就是为什么它们是按照它们的方式设计的。)David Warren设计了一种抽象的计算机,它有专门的堆和栈,还有它自己的汇编语言,它对执行编译的Prolog程序进行了高度优化。它以一种或另一种形式被大多数严肃的Prolog实现使用。

虽然前四个特性使Prolog成为一种特殊的语言,用来表达解决诸如篮球调度问题等问题的解决方案,这第五个特性,使它成为实现解决方案的实用语言。

为什么 Amzi! Prolog + 逻辑服务器?

Amzi!PrologProlog语言的强大实现。它的集成开发环境(IDE)包括一个编辑器、解释器(侦听器)和用于开发Prolog模块的调试器,以及用于部署它们的编译器、项目和链接器。

Amzi!的真正潜力是在逻辑服务器中实现。这个杰作可以很容易地将Prolog基于规则的组件与传统的编程语言、数据库和其他开发工具和库集成起来,比如GUI或网络工具。


逻辑服务器在一个共享库中(.so. dll) 封装了AmziProlog引擎,有了它自己良好的内存管理,并且包含了一个完整的应用程序接口(LSAPI),它使任何其他语言都可以方便地访问它,包括调入和调出。

虽然逻辑服务器API可以被任何可以调用共享库的系统直接调用,覆盖函数是为流行语言提供的,如C++JavaDelphiVisual BasicC++Java包装器在一个类中封装了LSAPIDelphi包装器使它成为一个组件,而Visual Basic包装器提供了一些简单的函数,可以自动处理错误恢复和字符串的转换。

外呼函数允许任何人将Prolog连接到任何东西,但是该产品包括预先构建的函数库,比如为任何应用程序连接到ODBC数据库,以及为Delphi用户连接到Delphi图形功能。

Amzi!是一种非常轻便的工具,有兼容的命令行版本运行在WindowsLinuxSolarisHP-UX的下面。核心实现是在C++中,系统可以很容易地移植到任何带有C++编译器的平台上。

在任何环境中,Amzi! Prolog +逻辑服务器为那些难以用传统工具实现的模块提供了一个干净而优雅的解决方案,一种简单而自然地与这些工具集成的解决方案。

在常规使用中,Amzi! Prolog和Prolog是如何工作的?

过程控制

Indra Systems正在为瑞典最大的奶酪制造商建立一个质量控制系统,使用AmziPrologDelphi。该系统监控来自工艺设备的输出传感器。当检测到质量的变化时,操作员会收到警报,一个规则基会对如何调整工艺过程提出建议。

惠普使用Prolog规则基来测试和修复他们的个人电脑板。

 

业务顾问

一家主要的计算机制造商正在使用通过ToolbookAmzi!的学习优势构建的销售顾问软件。该顾问询问有关前景网站的问题,然后应用一个大约175条规则的规则基来推荐最适合该客户的产品。

美国、欧洲和澳大利亚的养猪户利用Prolog来调整饮食、住房和其他因素,以提高畜群的盈利能力。波音公司使用Prolog为工程师、制造和现场工作人员提供如何正确组装需要特殊工具的电气连接器的建议。

 

Scheduling & Evaluation调度与评价

约克大学正在使用VisualBasic和Amzi!来实现注册规则,部门主管使用VB图形用户界面来概念化和测试他们部门的规则。然后,这些规则是“黑盒”的,并运行在一个将它们应用于单个学生的服务器上。大西洋沿岸联盟使用了一个Amzi!Prolog规则基来安排他们本赛季的篮球比赛。

在荷兰,Prolog用于安排网球比赛,进行播种,解决降雨延迟等问题。Rotisserie/Fantasy篮球使用Prolog来计算每周的排名和预测性能。

 

配置和调优

Xircom使用C/C++Amzi!安装他们的网络和调制解调器卡。安装程序检查可用的资源和笔记本电脑的配置。Amzi!规则基用于确定哪种配置最适合新卡。微软在其NT网络安装程序中使用Prolog组件来配置网络。

 

解析和自然语言

Amzi!在其访问数据库中使用Prolog组件来解析和扫描输入来自各种杂志的销售线索。

    Amzi!,惠普、波音和其他许多公司都使用Prolog来构建自己的定制规则语言。


三、Amzi! 技术、产品和服务概述


Amzi!专攻产品和服务,用于开发和部署应用逻辑知识的集成应用程序组件,如定价规则、配置逻辑、保险规则、诊断和咨询知识、语法规则、消息翻译规则和语义关系。

与使用传统软件工具自然部署的事实和过程知识不同,在没有专门工具的情况下,很难部署逻辑知识。

 

事实和过程性知识

传统的软件工具提供了两种编码知识的方式:一个是记忆中的事实或数据;另一种是用过程编程语言编写的指令序列,如JavaC++VisualBasicDelphiC#

这两种类型的知识,事实和过程性,对于计算机来说是很自然的,因为计算机是从内存(事实/数据)和执行一系列指令(过程)的处理单元来设计的。数据库工具和过程式编程语言从最早的时候就开始用于计算机,这并非偶然。早期商业用计算机被称为数据处理,这并非偶然。

考虑一下航空订票系统。它对存储在数据库中的乘客、航班和预订机票有事实知识库。它有操作数据的程序,例如在飞机上预订乘客。

这种自动化非常适合计算机的设计。

逻辑知识

逻辑知识是关系。在纸面上,逻辑知识可以表示为规则,或者在显示条件和隐含结果的表中,或者作为显示连接的图形,或者是特定于给定应用程序区域的格式。

在航空订票系统中,定价知识是合乎逻辑的。这是一套复杂的规则和表格,描述了机票和日期、地点、联系、持续时间、航班、飞行里程、周末、假期、折扣、促销以及其他什么东西之间的关系。

逻辑知识,除非相对简单,并不适合在计算机中进行简单的编码。

它在数据库中不太合适,因为所表达的关系要比简单的事实关系数据库所能编码的复杂得多。

它不适合在过程代码中,因为程序员被迫将独立的逻辑关系作为一组指令进行人工表达,并具有明确的控制流。

 

逻辑知识的例子

定价 —价格和影响它的因素之间的关系,几乎任何一种哪怕是适度的复杂性的产品;t

规章制度 —政府和私人组织的规章制度,如税法、保险规则、法律要求、福利、采购和工作流程;

配置 —客户需求与产品和组件之间的复杂关系;

支持 —诊断技术支持解决方案中的缺陷与症状之间的关系,或客户需求与适当的产品和服务之间的关系;

调度 —管理广播调度、广播电视音乐调度、工作调度、资源分配、体育赛事的规则;

语法规则 —数据传输协议、程序输入或自然语言之间的翻译规则;

科学 —地表观测与地下石油的地质关系、电路行为、网络建模、医学诊断和经济建模。

使用传统工具用于逻辑知识

虽然不太适合这项任务,但传统工具通常用于编码逻辑知识。
在少数情况下,传统的工具是可行的。例如,如果关系很简单,可以用相同的列表示,那么可以有效地使用数据库。如果规则适合于决策树,那么该树可以用过程分支语句表示。
    但是,任何意义上的逻辑知识在关系中都有各种各样的因素,使它们不适合数据库; 而且没有隐含的执行顺序,这使得它们在程序上的代码变得很笨拙。根据输入数据,需要不同序列中不同的规则组合。
使用传统工具的优点是,它们是传统的工具。有大量的程序员熟练地使用它们。
使用传统工具的缺点是,为了表达相互关联的逻辑关系而需要的过程代码和/或分散的数据表集合,最终成为了一个笨拙、难以维护和高度错误的代码的鼠窝。
对于某些应用领域,这可能不是一个因素。但是,如果逻辑知识正在发生变化,并且跟上这些变化是很重要的,那么维护逻辑知识的编码的成本就会变得令人望而却步。更重要的是,由于这种方法的时间消耗和容易出错,竞争优势很可能会丧失。
 

There's If-Then and then there's If-Then

术语“if-then”的规则有时会让人感到困惑,因为它既用于描述过程中的分支指令,也用于描述某些逻辑关系。在过程代码中,if-then语句掌控着控制流。作为逻辑关系,if-then规则没有隐含的执行顺序。

面向对象的程序设计

面向对象编程是什么呢?在计算机科学术语中,一个对象是一个封装,在一个实体中,数据和处理这些数据的过程。面向对象编程是一种强大的工具,它使程序员开发和维护能够更容易操作数据的过程代码的工作变得更加容易。

但是面向对象的编程并不能解决逻辑关系知识所带来的问题,因为它仍然只提供数据和过程的语义。

网络工具

脚本语言有什么呢?HTML ?Java Bean ?活动服务器页面?还有其他的Internet工具?这些都是为CPU生成指令序列的工具。

用于逻辑知识的虚拟机

如果编码逻辑知识的问题是底层机器,那么做正确的工作所需要的是一个设计用来处理逻辑知识的机器。构建硬件机器不是很实际,但是软件可以用来构建各种各样的虚拟机。
这正是在专家系统、业务规则系统、知识库系统、逻辑库系统、案例基系统和其他工具可用的所有工具中所做的工作。

这些工具都有一个虚拟机架构,其中有两个关键组件:

  • 一种知识表达语法和接口,用于在文件中调用知识库来输入和维护逻辑关系。
  • 一个推理机,它接受输入数据,并使用知识库,产生答案。

例如:

  • 一个定价应用程序有一个价格规则和条例的知识库;使给定航班的细节作为输入;产生一个票价作为输出。
  • 一个支持应用程序具有诊断规则的知识库;使给定问题的症状作为输入;并产生一个解决方案作为输出。
  • 一个配置应用程序有相关组件的知识库; 使客户需求作为输入; 并生成一个配置组合作为输出。

这种体系结构提供了一个主要的好处,即逻辑知识不再需要被强制转换成一种格式,而这种格式对于编码来说它是不合适的。因为逻辑知识在一种知识表示语言中更自然地表达,它更容易创建和维护。因为它更容易维护,更不易出错,更可靠,并且变更能更快地纳入到生产软件中。

在某些情况下,逻辑关系可以由具有知识的人直接维护,从而避免了通过中级程序员的翻译步骤。这进一步放大了收益。

人工智能(AI)

人工智能(AI)的科学涉及到它自身己的工程学和虚拟机的使用,这些虚拟机处理知识,知识不容易被事实或过程来表达。处理逻辑知识是AI的很大一部分。AI这个词可能有些道理,考虑到人类的大脑,与计算机不同,它自然擅长处理逻辑关系。

针对不同应用程序的不同工具

不幸的是,不同应用领域所需的逻辑知识的形式有很大的多样性,因此,有许多不同的工具和方法。

一个给定的工具与特定应用程序的匹配程度取决于知识表示语言和推理引擎如何与应用程序逻辑自然地表达和使用的方式相匹配。

例如,定价知识通常是正式和明确的,而关于技术支持的知识则有更多的不确定性,而且还需要对文本或HTML问题和答案的支持。配置知识包括组件如何组合的规则,还需要表达部件层次结构的逻辑关系。

定价和技术支持都会让推理引擎专注于寻找特定的解决方案,但是对复杂产品的配置的知识需要以构建块的方式来应用,创建一个复杂的结构作为输出。

有许多通用的工具可能适合给定的应用程序,或者一个组织可能决定为他们的特定应用程序构建一个定制的工具。

一个定制的工具有巨大的好处,知识表达可以被设计成与该应用程序的知识表达方式相匹配。这通常意味着那些有知识的人可以在没有程序员干预的情况下直接维护知识库。

一个通用的工具可以购买现成的,并且可以为应用程序提供足够的功能。

电子表格,第一个Logicbase(逻辑库)工具

电子表格是特定类型逻辑知识的专门工具的完美示例。在这种情况下,逻辑关系是连接各种单元格内容的算术公式。

电子表格程序的设计者首先创建了单元格的模式,以及允许用户可以用公式来表达关系。这就是知识表达。

然后他们编写一个程序,知道如何在电子表格中计算所需的单元格这就是推理引擎。

在电子表格中定义的逻辑关系,例如这个单元格等于这些单元格的总和,然后用于计算不同输入的值。其结果是,金融用户可以以一种熟悉的方式直接输入他们处理的关系类型,而不需要程序员。底层的电子表格引擎为它们做计算。

我们都知道,电子表格非常受欢迎,因为它们让非程序员编码由电子表格推理引擎执行的逻辑关系。当然,它们仅限于表达你可以在一系列相关的表格和公式中表达的东西。

知识库,下一个逻辑库工具

有许多通用的专家系统工具和业务规则产品遵循相同的体系结构。它们提供了输入逻辑关系的知识表达作为规则,以及一个知道如何执行这些规则的推理引擎。

这些工具非常强大,经常用于解决编码逻辑关系的问题。

它们成功的程度与特定逻辑关系的语义与给定工具的语义密切相关。当工具不太合适时,通常,程序员仍然需要为该工具编码关系。

这意味着那些拥有专业知识的人不会直接维护逻辑库。另一方面,这是比使用传统工具更好的解决方案,因为程序员现在使用的是逻辑关系的声明性规范,而不是强制他们进入过程代码。

其结果是对不断变化的环境做出更快、更可靠的反应。

Prolog, 纯逻辑

Prolog是一个工具,它有一个推理引擎,它将事实和关系的正规逻辑断言作为输入。它的知识表达是一种理想的关系,例如在法规和明确的商业规则中发现的。

Prolog逻辑可以被编译成快速执行,Prolog推理引擎非常适合从其他应用程序访问,使在应用程序中访问逻辑库变得容易。

Prolog 比大多数工具都有优势,因为它是一种 ISO 标准语言,有许多供应商提供兼容的实现。虽然不像 Java C++ 那样广泛,但许多程序员都曾接触过 Prolog

混合逻辑系统

对于那些有专门知识的人来说,他们更倾向于不那么正式的语法来表示逻辑关系,创建前端维护工具并不困难,这些工具可以将更非正式的表达转换为高性能的Prolog语法。

例如,开发人员可能会提供一个电子表格或数据库前端,让那些有技能的人能够进入规则和关系。

然后将其转换为生产的后端Prolog逻辑库

其结果是一个混合系统,它提供了特定于应用程序逻辑库的许多优点,具有可靠的、高性能的通用逻辑推理引擎,用于部署。


应用程序-特定知识库

    特定于应用程序的知识库对于那些具有成本效益的情况具有巨大的优势。它们为那些有专门知识的人提供了一个非常强大的工具,并且在不需要程序员介入的情况下进行部署。
其结果是快速可靠地改变业务逻辑知识,以响应不断变化的业务环境。 要权衡开发成本,因为需要时间和金钱来设计和构建一个定制的知识表示和推理引擎。
     Prolog可以大大降低构建这些定制工具的成本。除了它容易学习和使用的正规逻辑库能力之外,Prolog还支持更高级的逻辑编程。
     逻辑编程是一种非常强大的编程技术,它非常适合于实现用于维护和部署逻辑知识的定制工具。
     虽然Prolog的容易学习的纯逻辑在应用于自然的知识方面是有限的,使用逻辑编程,为无限的逻辑知识设计知识表示格式几乎是微不足道的。

      在使用传统编程技术的一小部分时间和代码中,逻辑编程可以用来实现推理引擎,它提供特定应用程序所需的任何排序行为。

逻辑编程

逻辑编程利用了Prolog的内置的模式匹配和搜索算法。它可能被称为元逻辑,因为在逻辑编程中,很容易创建各种各样的方式来表示和推理知识。

程序员需要一些学习才能熟练地进行逻辑编程,但是一旦学会了,就可以快速开发专门的知识库工具。

这种方法的优势是巨大的。它允许对知识表示定制为具体的容易处理的形式,这是最重要的,对那些知道如何编码的人来说。

其结果是,对知识的责任由那些有知识的人负责。

Amzi!产品和服务

Amzi! 提供各种各样的产品和服务,它们都是为了部署使用逻辑知识的应用程序组件。

产生的应用程序可以部署在Windows或Unix操作系统上,并集成到各种基于web或独立的环境中。

逻辑库

产品:

Amzi! Prolog的一个子集提供了一种易于学习和使用的语法,用于将逻辑关系直接表达为纯粹的logical assertions(逻辑断言)。这些断言组合在一起,形成了一个可以像数据库一样查询的逻辑库。

因为这样的逻辑库“纯粹的”逻辑,所以它最适合于那些规则和关系是清晰和明确定义的应用领域。例如包括税收或保险形式的规定,以及商业规则,以及业务规则,例如定价、承销或工作流。

Amzi!逻辑服务器允许将逻辑库部署在Web上或作为独立应用程序的一部分。它可以在Windows或Unix操作系统上运行,并直接连接到用Java、C++、VB、C#、 Delphi等语言编写的软件。

 Prolog语法也可以从其他形式的逻辑知识中生成。如果有知识的人有自己的方式来记录这些知识,比如在电子表格或数据库中,那么这个表单就可以被翻译成可执行的Prolog以获得Amzi!逻辑服务器的所有部署优势。

逻辑编程

产品: 

除了支持直接表示逻辑关系的逻辑库之外, Amzi! Prolog支持完整的逻辑编程能力。

逻辑编程是建模任何知识及其使用的理想方法。逻辑编程可能被称为元逻辑,因为它使用逻辑语句来描述一般属性和被建模的域的行为。

因为逻辑编程是Prolog 逻辑库功能的扩展,它可以用来增强具有额外功能的逻辑库。 它还可以用于创建全新的应用程序,用于表示和推理特定类型的知识。

逻辑编程应用程序的一些例子有智能教程、广播调度、产品配置、客户/供应商的模式匹配、用于矿山和产出的模式匹配、自然语言、和用于信息翻译的语法规则。

对于涉及知识表示和推理的应用程序来说,与过程编程工具相比,逻辑编程通常会产生超过10倍的生产力改进。改变为逻辑编程可能需要一到两周的时间来学习。

使用Amzi! Prolog开发的逻辑程序可以使用逻辑服务器部署,逻辑服务器为逻辑库提供了可嵌入性和可扩展性的所有优点。

定制方案

产品: Amzi!咨询公司

Amzi! 以各种方式提供定制的解决方案:

  • 构建自定义规则引擎和知识库工具。
  • 原型应用和技术转让。
  • 为Prolog环境提供定制扩展。
  • 为不同的环境提供端口。
  • Amz!产品在其他品牌下的授权销售。
  • 培训专业人员使用Prolog。

使用中的Amzi!产品和服务的例子

1)   WeatherShield 提供了使用混合逻辑库的门和窗户(玻璃类型)的配置和定价信息。 这些知识是由销售和制造专家以数据库格式维护的,它被翻译成一个Prolog逻辑库,用于在客户计算机上下载和部署。这使得做防风罩生意很容易。

2)   DigitalXPress提供实时流媒体视频,通过卫星进行多路广播和大量数据传输。他们的高性能调度器,一个逻辑程序,在输入优先级请求时,实时地创建调度。

3)   eoTek, 为Nexstar提供抵押服务的供应商,保持独立的定价和书面规则的知识库 maintains separate knowledgebases of pricing and under writingrules. 他们从纯Java途径转变为一种混合的逻辑库途径,更快地恢复了价格/承销的变更,缩短了测试周期,提高了可靠性,并提高了性能。这使得Nexstar在抵押贷款服务方面具有竞争优势。

4)   Youbet.com 为赛马爱好者提供动态的网络内容。它有独立的逻辑程序和逻辑库,描述了如何从一个巨大的、不断变化的供应商中提取内容,例如世界各地的各种赛道。这让他们可以快速为他们的客户提供最新的服务。

5)   CCH使用一种混合的逻辑库方法,用于填写保险表格的应用程序。改变规则和形式是由那些知道规则和形式的人来维护的,而不需要修改程序。

6)   GeoReferenceOnline 使用逻辑编程来实现一个复杂的本体论和语义网工具,用于构建帮助地质勘探的应用程序。

7)   U.S.Army 使用了来自Amzi!的自定义知识库,该知识库使用Arden医学专业语法来进行知识表示。该领域是乳腺癌信息,而知识是由非程序员直接维护的,他们拥有乳腺癌专业知识。

8)   CST聘请了Amzi!开发技术支持知识库工具作为初创企业的一部分。

9)   SAIC 为开发一个定制的知识存档和推理系统而分包了Amzi!,这将允许合作开发和利用来自政府资助的医学研究的知识。这是一个三层的纯Java应用程序。

10)  一个主要的计算机制造商雇佣了Amzi!来为Prolog引擎定制扩展,以支持专有的高性能Web应用程序。(这些扩展是最新的Amzi!发行版的一部分。)

11)  为化工和炼油行业提供设备设计和成本建模软件的供应商雇佣Amzi!将其Prolog引擎移植到VMS上,并Alphas利用64位寻址。

12)  PacificAI 雇佣Amzi!来设计和构建一个知识表示和推理引擎,用于在各种主题领域创建智能教程。

13)  Fitcentric雇佣的Amzi!为KnowledgeWright提供了一个客户夹具,它允许简单的编码和部署生理性逻辑知识,为耐力运动员提供指导建议。

14)  一位人力资源专家正在使用KnowledgeWright Guide Jig来实现一个知识库,提供关于可用员工福利的建议。

15)  一个软件应用开发公司雇佣了Amzi!来培训开发人员使用Prolog来实现航空公司的定价系统。

16)两个主要的软件供应商为在其工作流产品中包含进授权的Amzi!产品。

优点总结

这些是Amzi!途径的主要好处,它可以用来部署逻辑知识,帮助从一个保持良好统计的客户得到的一些指标。

  • 自动化“困难”组件 – 逻辑库可以很容易地实现使用传统工具有“困难”的应用程序组件。困难的典型原因在于它们被指定为一系列相互关联的规则和关系,这些规则和关系对于数据库来说太复杂了,但是在过程语言中却不容易表达。因为一个逻辑库是由非过程逻辑关系和规则组成的,这种类型的应用程序在Prolog中很容易。例如,一个用户用500行Prolog逻辑替换了5000行Java代码,这些代码实现了复杂的定价规则。
  • 让业务逻辑更接近那些最了解它的人 -逻辑库通常可以由那些维护业务规则的人直接维护。这有时是由于Prolog的声明性,有时Prolog可以很容易地代表各种类型的知识。例如,用于需要Java程序员实现更改的定价组件,现在一个混合前端允许这些更改由定价专家直接处理。
  • 更大的可靠性 – 逻辑库可以在集成之前进行独立测试和调试,从而更快、更无错误的实现。另外,代码减少10倍的通常意味着出错的代码更少。定价组件实际上是没有错误的。
  • 高性能 - 逻辑库执行极快。这是因为声明性的Prolog逻辑被编译为在专门的Prolog虚拟机上运行。动态Prolog逻辑被索引为高性能。定价组件部分在整个定价事务中占据了微不足道的一部分。
  • 大量使用 - 逻辑库是Web部署的理想选择。多个同步的逻辑库引擎可以在多个线程中运行。定价应用程序维护了一个逻辑服务器池,服务于在线需求。
  • 快速软件开发 - 组件是在使用过程语言和数据库所需时间的一小部分内开发的。开发人员不担心过程流控制或内存分配问题,而是将精力集中在纯应用程序逻辑上。定价应用程序在Java中花了两年时间来开发,但在Prolog中却不到两个月。
  • 易于集成 –逻辑库组件可以作为任何应用程序上下文的一部分被部署。Amzi!逻辑服务器API为流行的语言和环境提供了接口。定价组件是Java实时Internet服务的一部分。
  • 高度便携 - Amzi!逻辑库可以在大多数计算环境中运行。编译的逻辑库是独立于机器的,运行在Prolog虚拟机上。在Solaris和Windows NT服务器之间,定价组件没有变化。
  • 国际化应用 -使用Unicode或特定于地区的多字节字符集,逻辑库可以部署在任何国家语言中。定价应用程序是在英语中进行的。一个侵蚀顾问被开发出来并部署在中文里。

关于Amzi! 公司

  Amzi!公司是一家小型的私营企业,专门从事维护和部署知识的产品和服务,这些知识最好存储为逻辑关系。自1991年以来,该公司一直在经营业务,为众多的商业和政府客户提供服务,而这些客户只有一家小型的、专注的公司才能提供。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值