Prolog Tutorial Digest Cn

谓词(predicate)

事实 (facts)

参数可以是以下四种之一:
整数(integer) 绝对值小于某一个数的正数或负数。
原子(atom)由小写字母开头的字符串。
变量(variable)由大写字母或下划线(_)开头。
结构(structure)

联合(unification)

释放(unbinds)

回溯(backtracking)从上一次成功的位置的下一条子句开始继续搜索的过程。

Prolog的目标有四个端口用来控制运行的流程:调用(call)、退出(exit)、重试(redo)以及失败(fail)。
一开始使用Call端口进入目标,如果匹配成功就到了exit端口,如果失败就到了fail端口,如果用户输入分号,则又从redo端口进入目标。下图表示了目标和它的四个端口。

内部谓词 函数

输出谓词:

write/1 此谓词被调用时永远是成功的,并且它可以把它的参数作为字符串输出到屏幕上。当回溯时,它永远是失败,所以回溯是不会把已经写到屏幕上的字符又给删除的。

nl/0 此谓词没有参数,和write一样,从Call端口调用时总是成功的,从Redo端口回溯时总是失败的,它的作用是在屏幕上输出一个回车符。

tab/1 此谓词的参数是一个整数,它的作用是输出n个空格,n为它的参数。其控制流程与上面两个相同。

内部谓词not/1

:- 连接符,一般可以读作‘如果’。

规则:查询的定义

把所有定义相同的谓词的子句之间的关系想象“或者”的关系
不关心定义,所以后面一个变量用“_”代替了。

:-dynamic people/1.

[X | Y]
首先,Prolog提供了把表头项目以及除去表头项目后剩下的列表分离的方法。其次,Prolog强大的递归功能可以方便地访问除去表头项目后的列表。

含有变量的事实可以当作规则使用。

display()

在我们的命令驱动的“寻找Nani”游戏中,为了使发出的命令更接近自然语言,可以使用操作符来定义。

goto(kitchen) -> goto kitchen.
turn_on(flashlight) -> turn_on flashlight.
take(apple) -> take apple.

size:small