函数式编程学习之路(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子句或者逻辑运算.

只不过一般程序的逻辑运算,没有这么强大.但运用这种模式,或以在传统编程中,解决一些复杂的逻辑处理.

同时,纯逻辑运算,也能达到程序设计目的,这个思想需要领会.纯逻辑运算,同时也是函数式编程.

元编程:

元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在编译时完成部分本应在运行时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射
反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为头等对象(如Lisp或Rebol)也很有用。支持泛型编程的语言也使用元编程能力。
元编程通常有两种方式起作用。一种方式是通过应用程序接口(API)来暴露运行时引擎的内部信息。另一种方法是动态执行包含编程命令的字符串。因此,“程序能编写程序”。虽然两种方法都能用,但大多数方法主要靠其中一种。
 
元编程在1994年初露端倪,由一个叫 Erwin Unruh 的人首先发现。

不是所有的元编程都用产生式编程。如果程序可以在运行时改变(如Lisp、Ruby、Python、Smalltalk、Lua、Groovy和JavaScript),这种技术可以不实际生成源代码就使用元编程。

最常用的元编程工具是编译器,把高级语言转换为汇编语言或机器语言。更灵活的方法是在程序中嵌入解释器直接处理程序数据。有一些实现例如为Object Pascal编写的RemObject's Pascal Script。
另一个很常用的元编程例子是lex和yacc,用来生成词法分析器语法分析器。Yacc通常用作编译器的编译器,生成一个把高级语言转换为机器语言的工具。
quine是一种源代码等于输出的特殊的元程序
面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。
 
这里面接触到一个很神奇的东西,就是Quine,如下:
    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);
        }
    }

就是程序自已输出自已!

posted @ 2013-05-02 18:18  人工智能-群513704292  阅读(455)  评论(0编辑  收藏  举报