【Prolog】prolog概述和约束满足问题(CSP)

一、概述

prolog是面向演绎推理的逻辑型程序设计语言,可用于人工智能,擅长做约束满足问题CSP,采用深度优先树。所谓逻辑型,就是按数理逻辑推导的方式,也就是消解法做题,没有控制流程语句。语法规则很简单,事实、规则、目标问题。它的实质是一种知识数据库,重点在于查询。它是非过程性的。

Problog是基于Prolog范例的。

要区分模型和实现,例如谓词逻辑模型→实现语言Prolog。lambda逻辑模型→实现语言LISP。

编译器:visual prolog、amzi!prolog、SWI prolog、Turbo prolog、B prolog、Strawberry prolog、Sicstus prolog。

二、案例

%事实
love(a,b).
love(b,a).
%规则
lover(x,y):-love(x,y),love(y,x). %x与y是恋人关系的条件是:x喜欢y,且,y喜欢x
%目标
lover(a,Who).
%输出:Who=b

%汉诺塔
Step(1, A, C, B) :-
write('从'),write(A), write(' 移动到'), write(C).
Step(N, A, C, B) :-N > 1, M is N-1, Step(M, A, B, C), %step表移动
Step(1, A, C, B), Step(M, B, C, A).

三、语法

基本语句horn:事实、规则、目标。

语法是谓词(参数1,参数2...).记住这个句号一定要打。这是标准的谓词逻辑记法。

参数类型可以是数、原子(字符串等)、变量(大写开头,_表示空变量)、结构等。

:-表蕴含。

,表示合取,即“且”。

?-表问题。

;表示继续查询。

.表示结束符号。

%表注释。

四、约束满足问题(CSP)

prolog常用于解CSP问题。

CSP(约束满足问题),由一个变量集合和一个约束集合组成。问题的一个状态是由对一些或全部变量的一个赋值定义的完全赋值:每个变量都参与的赋值。问题的解是满足所有约束的完全赋值,或更进一步,使目标函数最大化。通过识别违反约束的变量/值的组合迅速消除大规模的搜索空间。是人工智能的重要分支。

经典案例:爱因斯坦谁养鱼的题。解题要点:题目的要求就是,给出一个排列组合,使其满足所有条件。最简单的是生成所有组合,然后进行测试,对这个题目而言,排列是(5!)^4,也就是2亿种组合,的确有点多。正确的解法是提高生成组合和筛选的效率,算法的关键就是在这里。它不仅关注“是什么”,还关注“不是什么”。下述案例中,已知颜色唯一,a住红房子,那么bcde都不能住红房子了,通过这种方式消除了可能性空间。

CSP三元组X,D,C:

X:变量集合 (variables)

D:值域集合,每个变量有自己的值域 (domain)

C:描述变量取值的约束集合 (constraint)

对比局部搜索(全分配,每次必须考虑整个状态),但是CSP,是部分分配,每次只需要考虑部分赋值。(一旦不是解,立即丢弃)。很多CSP只用推理是无法求解的,还需要通过搜索来求解。部分赋值的回溯搜索算法:可以用标准的深度优先搜索,状态可能是部分赋值,行动是将var=value加入到赋值中。回溯搜索用于深度优先搜索中,每次为一个变量选一个赋值,没有合法的值的时候就回溯。

你可能感兴趣的:(后端,lisp)