逻辑编程
- 接前面
- 着色应用
- 回溯倒水
- 递归汉诺塔
- 代码
- 从hello world开始
- 填词游戏
- 题目
- 答案
- 验证
- 后话
接前面
着色应用
让人眼前一亮。能不能解决其他冲突问题呢?
回溯倒水
也有冲突检测,一步一步试探。倒水逻辑跟着色很像。怎么写成逻辑编程代码呢?
递归汉诺塔
费尽心思,网上也没有找到办法,却有解决汉诺塔移动的代码。
代码
move(Start, End, Disk) :-
write('从'),
write(Start),
write('移动圆盘 '),
write(Disk),
write('到 '),
write(End),
nl.
hanoi3(N) :-
hanoi3(N, '塔座A', '塔座B', '塔座C').
hanoi3(1, A, _, C) :-
move(A, C, 1).
hanoi3(N, A, B, C) :-
M is N - 1, %取出前n-1个盘子
hanoi3(M, A, C, B), %将A塔座的前n-1个盘子通过塔座移动到B塔座
move(A, C, N), %将A塔座的最大盘子移动到C塔座
hanoi3(M, B, A, C). %将B塔座的盘子通过A杆移动到C塔座
从hello world开始
我修改了一下打印,添加打印汉诺塔移动盘的过程。
?-hanoi3(3)
从塔座A移动圆盘 1到 塔座C
从塔座A移动圆盘 2到 塔座B
从塔座C移动圆盘 1到 塔座B
从塔座A移动圆盘 3到 塔座C
从塔座B移动圆盘 1到 塔座A
从塔座B移动圆盘 2到 塔座C
从塔座A移动圆盘 1到 塔座C
1true
Next 10 100 1,000 Stop
但是,比C或Python代码长太多了,这不是逻辑编程应该有的样子。看填词游戏解决得多好,还是顺着它的思路学习吧。
填词游戏
把astante , astoria , baratto , cobalto , pistola , statale六个法语单词,交叉填到三横三竖的格子里。用C或Python要很多代码。
题目
Exercise 2.4 Here are six Italian words:
astante , astoria , baratto , cobalto , pistola , statale .
They are to be arranged, crossword puzzle fashion, in the following grid:
The following knowledge base represents a lexicon containing these words:
word(astante, a,s,t,a,n,t,e).
word(astoria, a,s,t,o,r,i,a).
word(baratto, b,a,r,a,t,t,o).
word(cobalto, c,o,b,a,l,t,o).
word(pistola, p,i,s,t,o,l,a).
word(statale, s,t,a,t,a,l,e).
Write a predicate crossword/6 that tells us how to fill in the grid. The first three arguments should be the vertical words from left to right, and the last three arguments the horizontal words from top to bottom.
答案
w o r d ( V 1 , , H 1 V 1 , , H 2 V 1 , , H 3 V 1 , ) , word(V1,_,H1V1,_,H2V1,_,H3V1,_), word(V1,,H1V1,,H2V1,,H3V1,),大概意思:V1要真(存在),题干里六个word里的某一个;_忽略第一个字母;H1V1,H1V1都要包含的字母。
crossword(V1, V2, V3, H1, H2, H3) :-
word(V1,_,H1V1,_,H2V1,_,H3V1,_),
word(V2,_,H1V2,_,H2V2,_,H3V2,_),
word(V3,_,H1V3,_,H2V3,_,H3V3,_),
word(H1,_,H1V1,_,H1V2,_,H1V3,_),
word(H2,_,H2V1,_,H2V2,_,H2V3,_),
word(H3,_,H3V1,_,H3V2,_,H3V3,_),
H1 \= V1, H2 \= V2, H3 \= V3.
验证
?-crossword(V1, V2, V3, H1, H2, H3).
H1 = astoria,
H2 = baratto,
H3 = statale,
V1 = astante,
V2 = cobalto,
V3 = pistola
也许只能这样一点一点的积累了。坦诚地表达,灵魂的拷问。
后话
like(Prolog).%喜欢逻辑编程
like(Python).
hate(C).%不喜欢C语音
hard(Prolog). %好难学
hard(C).
good(Prolog). %但是个好语言
good(Python).
good(C).
not(P) :- P, !, fail ; true.
get(X):- %我能学会吗?
like(X),good(X),not(hate(x)).
?- get(C). %能搞定C语音吗?
false
?- get(Python).
true
?- get(Prolog).
??????
我能学会逻辑编程吗?