Prolog子列表关系

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匹配,这似乎很奇怪?

rep*_*eat 6

当你写作时,我的印象是你非常接近:

对我来说,为什么我们不只是将列表分解为两个列表并检查其中一个列表是否与S匹配,这似乎很奇怪?

只需将列表分解L三个列表即可:

  • L1 是一个在子列表("前缀")之前的列表,
  • S 是子列表本身,和
  • L3 是子列表后面的列表("后缀").

因为conc/3只能连接(或分解)两个列表 - 而不是三个 - 需要两个 conc/3目标的结合.

conc(L1,L2,L), conc(S,L3,L2) 表达上述关系.


Guy*_*der 5

这应该有所帮助; 关键词/概念是difference list.

在此输入图像描述

来自Attila Csenki的 "Prolog Techniques" ,第2章(带嵌入广告的免费PDF)

书中的后者是这张图片

在此输入图像描述


书的第二部分实际上是一本单独的书,

Attila Csenki的 "Prolog应用" (带嵌入式广告的免费PDF)

  • 虽然[tag:difference-lists]是一个有价值的概念,但这个问题实际上并不需要*差异列表.所以更简单的答案可能会更有帮助. (2认同)