dram.me

答案集编程练习(第一期)

补遗

  1. 该练习参考了Luger《人工智能》第二部分前言中的例子。—— 2017-04-28

当前针对答案集编程的资料不多,多数有较高的门槛,在学习的过程中存在一定阻力。

现在想通过实践的方式辅助理解,这里将题目与参考的程序加以整理。以下是第一期的题目及题解,完整的程序可以在这里查看。

题目

abcd四个块,列举将他们叠加摆放在桌面的所有方法。其中abc为正方形,d为三角形。

解题

解题基本按四个步骤进行。

描述事实

block(a).
block(b).
block(c).
block(d).

cube(a).
cube(b).
cube(c).
pyramid(d).

枚举答案

所有块必须摆放在桌面或者其他块之上,基于此可以列举备选的所有可能答案集。

on_table(X) ; on(X, Y) : block(Y) :- block(X).

添加约束

在上一步骤获得的答案集中,有些答案集是无效的,需要加以筛选。

只允许将其中一个块放置在桌面上:

:- on_table(X), on_table(Y), X != Y.

块上之后放置一个块:

:- on(X, Z), on(Y, Z), X != Y.

不能将块放置在三角形之上:

:- on(_, X), pyramid(X).

不能循环堆叠:

above(X, Y) :- on(X, Y).
above(X, Y) :- on(X, Z), above(Z, Y).
:- above(X, X).

显示结果

#show on/2.
#show on_table/1.

结果

以下是在Clingo 5.2中运行的结果:

clingo version 5.2.0
Reading from blocks.lp
Solving...
Answer: 1
on_table(b) on(d,a) on(c,b) on(a,c)
Answer: 2
on_table(b) on(c,a) on(a,b) on(d,c)
Answer: 3
on_table(c) on(b,a) on(d,b) on(a,c)
Answer: 4
on_table(a) on(b,a) on(c,b) on(d,c)
Answer: 5
on_table(c) on(d,a) on(a,b) on(b,c)
Answer: 6
on_table(a) on(c,a) on(d,b) on(b,c)
SATISFIABLE

Models       : 6
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.001s

自由和自律

康德说过:“自由即自律。”未曾看过康德的哲学理论,以下只是就此引发的一些发散的想法。

另一个和自由相关的概念是:可控性、自主性。当你觉得一件事情是在自己的掌控范围内时,会有一种自由的感觉。或者觉得可以通过自己的努力(并且自己有这个能力)变得更好的话,会觉得自由。

总体感觉,自由和自律的平衡点即和谐。

自由常会分为两个部分,“事”和“物”的自由,和“人”的自由。一个事可以怎样怎样(变得更好),是这个事情发展的自由。而“我”可以为此做什么什么(让它变得更好),是人的能动性的自由。

某种程度来说,这是“客观性”和“主观性”的结合。

由于自由的特性,很多时候需要的是想象力、发散思维,而不是理性分析。依托想象力发现新的点子,再以理性分析其可能性。

一是目标,二是行动指南。一是梦想,二是实践梦想。

依循清晰的目标和指南行动,就是自律。

生活有两种状态,要么在梦想,要么在实现梦想。

答案集程序设计(Answer set programming)

无意间看到Potassco项目,进而了解到答案集程序设计(Answer set programming)的概念。

总体来说,要学习答案集程序设计,需要有这几方面的基础:逻辑编程知识表示、稳定模型(Stable model),这样的门槛不低。

以下是一些参考资料:

惰性和竞争

最近在断断续续想一个问题。

紧临的两家包子铺,一家是典型的脏乱差,一家是连锁品牌加盟店,干净整洁,规范化。

问题是:为什么脏乱差的那家没有主动地改变自己?

感觉从这一个问题上,不仅仅能看到商业和经济的某些规律,应该还能看出人性的一些东西。

至少从中可以看出的一点是:“竞争”不是促成改变的充分条件。在竞争之外,还需要其他因素。

在找出其中的原因的同时,很可能就可以找到激励主动改变的方法了。

另外一层问题是,通过竞争出发的改变是“被动”的,如何才是主动的改变?

一个个人、或者一家公司,也是和包子铺一样,在存在问题时,为什么没有主动改变?人无完人是事实,完美是不可能的,但人应该不断向着更美好的自己前进。

UI描述语言

依据Prolog声明式语言的特点,设计基于Prolog的UI描述语言,可以作为交互设计的描述工具,甚至可以据此直接生成html代码。

Qt的QML可以参考。

← older posts