Tol*_*han 3 list prolog sublist difference-lists
我正在阅读Ivan Bratko的人工智能Prolog编程书籍,之前我没有使用过Prolog的经验.在书中,列表的子列表关系表示为:
S is a sublist of L if:
1) L can be decomposed into two lists, L1 and L2, and
2) L2 can be decomposed into two lists, S and some L3.
Run Code Online (Sandbox Code Playgroud)
关系如下:
sublist(S, L) :-
conc(L1, L2, L),
conc(S, L3, L2).
conc([], L, L).
conc([X|L1], L2, [X|L3]) :-
conc(L1, L2, L3).
Run Code Online (Sandbox Code Playgroud)
对我来说,为什么我们不只是将列表分解为两个列表并检查其中一个列表是否与S匹配,这似乎很奇怪?
当你写作时,我的印象是你非常接近:
对我来说,为什么我们不只是将列表分解为两个列表并检查其中一个列表是否与S匹配,这似乎很奇怪?
只需将列表分解L
为三个列表即可:
L1
是一个在子列表("前缀")之前的列表,S
是子列表本身,和L3
是子列表后面的列表("后缀").因为conc/3
只能连接(或分解)两个列表 - 而不是三个 - 需要两个 conc/3
目标的结合.
conc(L1,L2,L), conc(S,L3,L2)
表达上述关系.
这应该有所帮助; 关键词/概念是difference list
.
来自Attila Csenki的 "Prolog Techniques" ,第2章(带嵌入广告的免费PDF)
书中的后者是这张图片
书的第二部分实际上是一本单独的书,
Attila Csenki的 "Prolog应用" (带嵌入式广告的免费PDF)