Getting started with Prolog-1

博客分类: 技术 阅读次数: comments

Getting started with Prolog-1

概况

语法结构

| ?- write('Hello,'), nl, write('world').
Hello,
world

yes
| ?- halt.

4 种元素(term):

其中

三种基本结构:

在程序中定义一组事实和规则,然后执行查询。

多个子目标用逗号隔开组合成复合的查询,逗号相当于逻辑且。

\+:逻辑非。

编译查询

friends.pro

编译方法

在终端gprolog中编译:

方括号、单引号。

| ?- ['friends.pro'].
compiling /home/.../prolog_crash_week/day1/friends.pro for byte code...
/home/.../prolog_crash_week/day1/friends.pro compiled, 5 lines read - 1051 bytes written, 5 ms

(1 ms) yes

编译成功返回yes(true)。

编译输出可执行文件

gplc friends.pro

输出./friends,执行后又进入终端。

在终端中执行查询

| ?- friend(grommit, wallace). 

yes

查询结果返回是或否。

连续查询多个结果项

| ?- likes(grommit, What).

What = cheese ? ;

What = cake

yes

在查询中用新的任意变量名占位,可以列出所有符合条件的变量,或者查询是否存在变量符合条件。终端返回一项符合条件的结果后手动输入分号查询下一个,输入回车可以提前终止查询并返回yes;若连续输入分号直到输出了所有符合条件的项,则会在在输出最后一项后立即返回yes;若连续输入分号之后返回了no,说明存在不能由简单的事实直接确定的项,需要进一步计算。输入a可以输出所有剩余的结果。

food.pro

| ?- food_flavor(What, savory).

What = velveeta ? ;

What = spam ? ;

What = sausage ? ;

(1 ms) no

地图填色问题

map.pro

Prolog 不需要人在程序中输入算法,而是由计算机自己尝试解决逻辑问题。

If you can describe the problem, you have solved the problem.

| ?- coloring(Alabama, Mississippi, Georgia, Tennesse, Florida).

Alabama = blue
Florida = green
Georgia = red
Mississippi = red
Tennesse = green ? a

Alabama = green
Florida = blue
Georgia = red
Mississippi = red
Tennesse = blue

Alabama = blue
Florida = red
Georgia = green
Mississippi = green
Tennesse = red

Alabama = red
Florida = blue
Georgia = green
Mississippi = green
Tennesse = blue

Alabama = green
Florida = red
Georgia = blue
Mississippi = blue
Tennesse = red

Alabama = red
Florida = green
Georgia = blue
Mississippi = blue
Tennesse = green

(1 ms) no

合一(Unification)

ohmy.pro

这里的等号表示unify,即“要求两侧相等”,而不是赋值,所以可以左右交换而不改变含义和结果。同时,x = x + 1这样的程序会返回no,因为Prolog的变量要么有固定的值,要么不具有特定值。

| ?- dorothy(lion, tiger, bear). 

yes
| ?- dorothy(A, B, C).          

A = lion
B = tiger
C = bear

yes
| ?- twin_cats(A, B).

A = lion
B = lion ? a

A = lion
B = tiger

A = tiger
B = lion

A = tiger
B = tiger

yes

GProlog Manual

Amzi! inc. Adventure in Prolog tutorialProlog 语言入门教程 - 阮一峰的网络日志[Solving murder with Prolog xmonader](https://xmonader.github.io/prolog/2018/12/21/solving-murder-prolog.html)Prolog 基础 <1> - 面向信仰编程 wikibooks