【发布时间】:2019-01-25 17:28:53
【问题描述】:
我正在阅读 Ivan Bratko 的 Prolog Programming for Artificial Intelligence 一书,但我之前没有使用 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.
关系如下:
sublist(S, L) :-
conc(L1, L2, L),
conc(S, L3, L2).
conc([], L, L).
conc([X|L1], L2, [X|L3]) :-
conc(L1, L2, L3).
我觉得奇怪为什么我们不只是将列表分解为两个列表并检查其中一个列表是否与 S 匹配?
【问题讨论】:
-
conc(L1, L2, L)正在将列表分解为两个列表;因此,您建议的实现看起来像sublist(S, L) :- conc(_, S, L) ; conc(S, _, L).如果您使用sublist(S, [1,2,3,4])查看该实现的输出,您会注意到永远不会生成[2,3],但是您会得到所有以 1 开头的子列表以及所有以 1 结尾的子列表4.
标签: list prolog sublist difference-lists