函数式编程学习之路(12)
Prolog(Programming in Logic的缩写)是一种逻辑编程语言。
声明式编程的另一端,逻辑编程,其实逻辑编程Prolog很特别,可以理解成就是逻辑运算,所有结果,不是True就是False
PROLOG语言的程序结构非常简单,由三部分组成,即事实、规则和询问
1.事实
事实用来说明有关客体及客体之间的相互关系。事实和规则都是逻辑推理的前提。
likes(john,mary).
事实中的关系(如 likes)称为谓词,客体称为自变量。事实的语义是表示该语句恒为真。在PROLOG语言的标准形式中,谓词和确定的客体(常量)必须以小写字母开头,而变量客体用大写字母开头,客体间用逗号","分开,用一对圆括号括住,最后用“.”终结。
female(jane). jane是女性。
play(jane,mary,chess). jane和mary下棋。
关系中自变量的个数是任意的,而语句意义的解释由程序员所确定。如 likes(john,mary),可解释成John喜欢Mary,也可解释成Mary喜欢John。因此解释一个谓词含义是完全由程序设计者决定的,但一经确定,就必须在整个程序中遵守。
2.规则
规则是关于客体及其关系的一般陈述,表明某些关系的成立要依赖于其他一些关系的成立。规则可以是事实的一种紧凑的表现形式。自然语言中,用"如果"一词来说明规则。在PROLOG语言中,规则由规则头和规则体组成,其间用符号":-"连接。符号":-"表示"如果"。规则用"."结尾。例如"如果某人是学生,则john就喜欢该人"。用PROLOG语言书写应为
likes(john, X):-student(X).
头(结论) "如果"体(前提)
表示如果student(X)成立,则likes(john)就成立。
PROLOG语言的规则的一般形式为:
p:-p1,p2,p3,…,pn.
其中p1,…pn均为命题。在此,逗号","是合取(∧或并且)的意思。
一个谓词可用一些事实和规则的组合来定义,称为谓词的子句。
可以把PROLOG程序看做是事实和规则的一个库,称为数据库或知识库。PROLOG系统的任务就是依据知识库中的知识(事实和规则的集合)来回答用户的问题。编写PROLOG程序,实际上就是提供所需要的事实和规则,PROLOG系统能使计算机去利用事实和规则及自身所带有的推理方法,从一些事实推理出另一些事实。
3.询问
PROLOG语言是一种可会话式语言。执行一个PROLOG程序实际上就是进行人机对话,在将事实和规则存人数据库或知识库中后,就可以向系统询问一些有关的问题,而问题就是系统求解的目标。
例如设有数据库:
likes(mary,wine).
likes(john,meat).
likes(john,X):-likes(mary,X).
就可以询问:"Mary喜欢葡萄酒吗?"或"John喜欢什么?"
PROLOC语言的询问的一般形式为
?- p1,p2,…,pn.
其中"?-"是PROLOG语言询问的特殊符号,p1,p,…pn的意义与规则中的意义相同。询问的语义是:“p1∧p2∧…∧pn”是为真吗?"。
因此,上面的"Mary喜欢葡萄酒吗?"或"John喜欢什么?"询问可分别写为:
?likes(mar,wine).
?ikes(john,X).
于是,PROLOG系统将根据数据库或知识库中的事实和规则进行推演来回答用户的问题。
由上面可以看出,逻辑编程,主要就是要陈述事实,定义规则,然后,提出问题,让计算机去运算分析逻辑,告诉你结果是True,或False,这很象Where子句或者逻辑运算.
只不过一般程序的逻辑运算,没有这么强大.但运用这种模式,或以在传统编程中,解决一些复杂的逻辑处理.
同时,纯逻辑运算,也能达到程序设计目的,这个思想需要领会.纯逻辑运算,同时也是函数式编程.
元编程:
不是所有的元编程都用产生式编程。如果程序可以在运行时改变(如Lisp、Ruby、Python、Smalltalk、Lua、Groovy和JavaScript),这种技术可以不实际生成源代码就使用元编程。
public class Quine { public static void Run() { string s = "public class Quine{{public static void Run(){{string s={0}{1}{0};System.Console.Write(s,(char)34,s);}}}}"; System.Console.Write(s, (char)34, s); } }
就是程序自已输出自已!