Prolog 学习 (一)

来源:互联网 发布:阿里云免费开通吗 编辑:程序博客网 时间:2024/06/05 04:20

为写一个简易的专家系统,打算短时间学会初略的使用Prolog语言

参考资料:tyros73.pdf (官网的tutorial 文档,后面的内容许多将引用自此,简称tyros PS: 貌似没简多少-_-! ), 《人工智能教程》,百度文库上的两个ppt

IDE: Visual Prolog (以下简称VIP ps: 囧,这是官方简称,不是我取的。。。)

1. 安装及初运行VIP

从 http://www.visual-prolog.com/vip6/product/ 下载Personal Edition版,永久免费(不过处处提示升级商业版 -- 付费版)。

一路next。成功后找到Help -> Enter License, 点注册个人版,跳转到官网注册页面。用个人邮箱注册即可。注册成功后系统会把License发到邮箱,用这个License

激活VP(不激活debug时会蹦出激活提示,反正不收费,就激活个呗)。


2. Hello World

2.1 逻辑的来源

tyros 上夸了古希腊人如何智慧,这样的社会如何造造了逻辑的重要性。不过,不得不承认西洋社会现在之所以牛X是离不开古希腊文化的,古希腊的德先生和赛先生

让我一个现代人都情不自禁折服。下面来一段

"Our constitution does not copy the laws of neighboring states;
we are rather a model to others than imitators ourselves. Its
administration favors the many instead of the few; this is why it
is called a democracy. If we look to the laws, they afford equal
justice to all in their private differences; if no social standing,
advancement in public life falls to reputation for capacity, class
considerations not being allowed to interfere with merit; nor again
does poverty bar the way: If a man is able to serve the state, he
is not hindered by the obscurity of his condition from proposing
laws, and political actions."

如果古罗马共和国没有灭亡,世界现在会是什么样子呢?扯远了。。。咱言归正传。

2.2 第一个GUI小程式

 点击New Project (你会立马找到的),Project Name就叫proj1, Project Kind不变,就是GUI,下面的路径(Base Directory)自己选,点OK。

 然后可以运行测试下是否创建了健康的工程,点Build -> Execute (注意,和其它一般IDE不同,这里不要去Debug 中点run;tyros写的是Build -> Build,但是点了之后并没有

出现tyros上形容的理想结果,只有点了Excute才是真的运行,Build嘛,只是Build一下喽,根本不会运行的),这时在任务管理器里就会看到proj1.exe成功运行了。

Excute后就会出现一个以proj1为名的window,和MFC, Qt下创建的窗口类似,麻雀虽小,但是最起码样子上基本的New Help什么的toolbar上都有。

但这个都有只是形式上的,并没有真的相应功能,下面就来一步步实现这些功能。

先谈下架构,一个Window(就是刚才蹦出来的"麻雀")可以包含n个Form,New一个,就会出来一个Form。

首先来实现新建Form的功能。File -> New in New Package, IDE会自动创建一个原型Form, 可以在图形编辑窗口和参数表里更改这个Form的大小,并把这个Form命名为

query。回到项目表中找到TaskMenu,展开,在&File里点&New\tF7, 把Disabled前面的勾去掉。关闭这个编辑窗口。继续去项目编辑器里找到TaskWindow.win,双击打开,找到Menus -> TaskMenu -> { id_file_new -> onFileNew }, 会出现代码编辑器。找到

clauses                                                           %语句

onFileNew(_Source, _MenuTag).               %语句必须由"."结束(相当于C里的";")

 

修改为

clauses

onFileNew(W, _MenuTag) :- _X= query::display(W).   % :=表示定义,::表示蕴含

退出代码编辑器并保存。Build ->Execute 查看运行结果,测试New功能是否好使(蹦出名为query的Form)。 

 

2.5 继续说逻辑:亚里士多德的三段论(Aristotle’s Syllogistic)

上面那个小sample就相当于Hello World了,以激发码农的兴趣,下面来扯正题了。

对于亚里士多德来说,一个提议(Proposition)包含主题(subject)和前言(predict),并有量词(quantifier)辅助。 前言是主题的前置词(preposition)。

量词就像是“每次”,“没有”,“一些”等形容性词汇。三段式由两个前提(premise:major premise P和 minor premise S)和一个结论(conclusion M)组成。

每一个三段论就组成一个元组(tuple),许多元组集合在一起就成了语气(mood or modu) 。

∀ = All,  ∃ = Some

规则 从已知事实进行推断

:- 是if 把规则分为规则头和规则体

必须使用”.”作为结束,写在CLAUSE中

 

问题

变量名要用大写或者下划线开始,并且没有赋值语句,通过与事实和常量匹配来获取值。在被“赋值”前变量是Free的,“赋值”后是Bound的,在有关问题回答后将会自动回归成Free.

匿名变量:根本无需“赋值”(了解)的变量

谓词表示关系

 

论域段(DOMINS)

一旦一个参数被声明为特定论域,就不能与其它论域混合,甚至相同论域也不行。不过自定义论域可以与预设论域相匹配。

如果使用了标准论域,就不需要论域段。

谓词(PREDICATE)


新建一个Console程式

新建一个ES_test后,找了半天也没有看到传说中的main.pro,后来才知道原来要先Build -> build一下才会出现,或者在File -> open里直接打开 ̄□ ̄||

implement main    open coreconstants    className = "main".    classVersion = "".clauses    classInfo(className, classVersion).clauses    run():-        console::init(),        succeed(). % place your own code hereend implement maingoal    mainExe::run(main::run).

写一个 替换为

implement mainclass predicatesfact:(integer N, integer Res) procedure (i,o).clausesclassinfo("facfun", "1.0").fact(N, 1) :- N<1, !.fact(N, N*F) :- fact(N-1, F).run():- console::init(),fact(stdio::read(), F), stdio::write(F), stdio::nl.end implement maingoalmainExe::run(main::run).
Build -> run in window 

随意输入一个数,看运行结果