Visual Prolog支持基于网络的开发、数据库、多媒体、与C语言集成等。具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。非常适合于专家系统、规划和其他AI相关问题的求解。

Ch1 Prolog基础

       目标子句(goal clause)、事实(facts)、规则(rules)合起来称为Horn子句,因而得名Horn子句逻辑。

       Prolog可以作为专家系统来使用,但它本身却是作为一种程序设计语言而设计出来的。把Horn子句逻辑变为一种程序设计语言的2个重要因素:

(1)       严格的搜索顺序或程序控制;

(2)       副效应。

1.       程序控制

       Prolog不使用随机搜索策略,而总是使用同一种策略。系统保持一个当前目标,始终从左到右进行求解。当求解一个特定子目标时,当前目标中待求解的那个子目标将被其规则右边的那些子目标所代替。所谓的“谓词”,就是相当于其他编程语言中的过程或者子例程。它们之间的区别在于一个Prolog谓词对于一个单个提问可以返回多个结果或者没有结果(即失败)。

例:

parent(Person, Parent) :- mother(Person, Parent).

parent(Person, Parent) :- father(Person, Parent).

 

sibling(Person, Sibling) :- mother(Person, Mother), mother(Sibling, Mother).

sibling(Person, Sibling) :- father(Person, Father), father(Sibling, Father).

 

fullBolodeSibling(Person, Sibling) :-

    mother(Person, Mother),

    mother(Sibling, Mother),

    father(Person, Father),

    father(Sibling, Father).

1.1    失败(fail

       如果目标失败了,则说明定理中完全不存在针对该目标的解。

1.2    回溯

1.3    改进家庭定理

       问题在于:选择了一个不好的方式来形式化这个定理。原因是从考虑实体间的关系开始的。如果首先考虑实体本身呢?

person("Bill", "male").

person("John", "male").

person("pam", "female").

 

parent("Bill", "John").

parent("Pam", "Bill").

 

father(Person, Father) :- person(Father, "male"), parent(Person, Father).

1.4    递归

如何定义“祖先”关系?

ancestor(Person, Ancestor) :- parent(Person, Ancestor).

ancestor(Person, Ancestor) :- parent(Person, P1), ancestor(P1, Ancestor).

递归具有非常强大的功能,但也有一点难于控制。使用递归时,要记住:

(1)       递归必须能够前进;

(2)       递归必须能够终止。

1.5    副效应(side effects

例:

ancestor("Pam",X), write("Ancestor of Pam: ", X), nl().

Ancestor of Pam: Bill

X = Bill

Ancestor of Pam: John

X = John

2 Solutions

PIE给出的结果和自己给出的结果混在一起,怎么办?一个简单的办法是确保该目标没有解,例如:

ancestor("Pam",X), write("Ancestor of Pam: ", X), nl(),fail.

Ancestor of Pam: Bill

Ancestor of Pam: John

No solutions

Fail是一个预先定义的谓词,它总是失败,没有解。

注意:

(1)       目标本身不存在单一的解,从而使想要的全部解都作为副效应形式给出;

(2)       副效应在失败计算中也存在。

建议:

将计算性代码与执行输入输出的代码分开。

2.       Prolog算符

2.1    算符

简单论域(simple domains):字符串、数、符号、字符。

复合论域(compound domains):简单论域的一个集合。

例如:person(Name, Gender)

注意上面的式子既不是事实,也不是谓词。person就是所谓的算符。

例:

father(person("Bill","male"), person("John", "male")).

father(person("Pam","male"), person("Bill", "male")).

 

grandFather(Person, GrandFather) :- father(Father, GrandFather), father(Person, Father).

 

> grandFather(X, Y).

X = person(Pam,male), Y = person(John,male)

1 Solution

2.2 深入理解算符

       算符的一个重要特性:一个算符的多个参数可以通过常见的Prolog变量和绑定值被分离和检查。

例:

parent(person("Bill", "male"), person("John", "male")).

parent(person("Pam", "female"), person("Bill", "male")).

parent(person("Pam", "female"), person("Jane", "female")).

parent(person("Jane", "female"), person("Joe", "male")).

 

grandFather(Person, TheGrandFather) :-

    parent(Person, ParentOfPerson),

    father(ParentOfPerson, TheGrandFather).

 

father(P, person(Name, "male")) :-

    parent(P, person(Name, "male")).

 

> grandFather(person("Pam", "female"),W).

W = person(John,male)

W = person(Joe,male)

2 Solutions

2.3 算符和谓词

       从技术角度上讲,一个算符代表一个将多个论域绑定到一块的逻辑功能。即,算符是一种使Prolog推理机把数据的各个部分放在一起的一种机制,它有效的把数据的各部分放在一个通用的盒子中。它只是一份数据,一个在很大程度上可以像一个字符串或数一样操作的数据。它不能够进行运算,它只不过简单的代表复合论域,并把自身的参数集成在一起。

       使用算符最大的好处在于:修改代码时可以自由的改变算符的内部参数,而对使用该算符的谓词无需做大的改动。

2.4 算符作为参数

       可以把一个算符作为另一个算符的参数。

2.5 算符递归

例:

ancestor(Person, Ancestor) :- parent(Person, Ancestor).

ancestor(Person, Ancestor) :- parent(Person, P1), ancestor(P1, Ancestor).

parent(person("Bill", "male"), person("John", "male")).

parent(person("Pam", "female"), person("Bill", "male")).

> P=person("Pam", "female"), ancestor(P, Who)

P = person(Pam,female), WHO = person(Bill,male)

P = person(Pam,female), WHO = person(John,male)

2 Solutions

2.6 算符使用策略

Prolog的好处在于:它可以使用一种内部代码能够高效使用的形式来描述客观数据。


Ch2 类和对象

      1. 对象模型

       语义实体是对象、对象类型和类。语法概念是接口、类的声明和实现。接口是一组命名的谓词声明。接口描述了对象之间的“界面”。接口描述了对象类型。对象由类产生。一个类包含了类声明和类实现。

 

2. 类实体

       一个类也有为这个类的所有对象共享的实体。注意:公共可访问类谓词在类声明中进行声明,而公共可访问对象谓词在接口中声明。这个规则没有例外。不可能在类声明中声明对象谓词,也不可能在一个接口中声明类谓词。

       在声明类实体时,在相关的声明前加关键词class

       在构造函数中,有两处赋值形式相同,但一个是更新对象状态的,另一个是更新类的状态的。

 

3.       模块

       类的一种特殊变体,根本不可能产生对象,一个非构造的对象类(或者直接称为模块)在声明中略去对象的类型。

 

4.       创建和访问对象

例:

goal

    P = person_class::new(“John”),

    Name = P:getName(),

    io::write(Name).

注意:

1)引用类中的名字时要用“::”,引用对象谓词时要用“:”。

2)尽管构造函数并不像一般函数那样声明,但它们返回对象的函数:返回类型包含在类声明中。

 

5.       接口对象模型

       按照字面意义来讲,在用到非对象类型的地方是可以用接口的。

 

6.       多重实现

       可以创建多个完全不同的类,创建同一对象。

 

7.       包容多态性(subsumption polymorphism

       无论同一种类型的对象的实现有多大区别,它们都可以用在同一个场合里。包容:只要两个对象都是那段上下文需要的类型,那么由这个类构造的对象或者那个类构造的对象一样可用。

 

8.       Support类型扩展

       一个接口可以支持多个其他的接口,也就是说:

(1)       该种类型的对象必须提供在被支持(直接或者间接)的接口中的全部谓词;

(2)       该种类型的对象同样具有所有其他(直接或者间接)的类型。

这种支持产生了子类型层次。

 

9.       Object超类型

       一个接口并不明确支持其他任何接口,却隐含的支持object接口。Object是一种没有内容(谓词)的接口,称object为所有对象类型的超类型。

 

10.继承(inherits

       支持多重继承。

 

11. 对象体系的其他特点

1)对象支持实现中的更多的接口;

2)存储器回收生效的确定者(finalizer

3)可以与C#中的委派无缝配对的对象谓词值。

 

12. VP5VP6的差异

12.1 句点(dots

       所有的声明(常量、论域、谓词、事实)均以句点(“.”)终止。

12.2 谓词(predicates

12.3 谓词论域(predicates domains

12.4 引用论域(reference domains

       不能引用一个非引用型的用户论域。

12.5 函数子句(function clauses

       返回值放在子句头的等号后。

12.6 常量(constans

       必须是一个确定类型的值。

12.7 事实(facts

1)可以为singledetermnondeterm

2)只能用在一个类的实现内部。

12.8 事实变量(fact variables

12.9 嵌套表达式与函数(nested expressions and functions

12.10 编译器命令(compiler directives

       以“#”开始,@表示转义序列不再使用。

12.11 条件编译(conditional compilation

       只适用于VP6中的段(sections)。

12.12 输入输出及特殊论域

       特殊论域指file论域和db_selector论域。引入论域只考虑向后的兼容性,新的风格是使用对象进行代替。流谓词使用匿名(anonymous)参数类型和省略(ellipsis)符号。

12.13 省略和匿名参数类型

       ”:代表“任意类型的0个或多个参数”。

12.14 库支持

       描述了VP5VP6之间名字的等价性。新的程序不应使用5x Vip库。


Ch3 Visual Prolog编程

1. Visual Prolog基础

1.1 程序结构

1)声明(declaration)和定义(definition

Prolog中,当需要使用一个谓词(或者复合论域)的时候,就可以直接使用,无需事先向Prolog推理机做任何的通告。

2)关键字

1.2 目标

goal

1.3 文件考虑

1.4 作用域访问

1class::

2open

1.5 面向对象

PFCProlg Foundation Classes

处理数据的机制是标准的回溯和递归机制。

2. GUI编程

3. 逻辑层

1)代码被分成3段。

2)一些谓词和论域被声明在.i文件中。

3)所有的实现被放在.pro文件中。

4.cl文件包含特殊谓词constructor的声明。

4. 数据层

 

注:其余内容可以参考 visual prolog自带的help文档。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐