【发布时间】:2013-03-25 15:43:09
【问题描述】:
我是 Prolog 的新手,我正在为大学考试学习它,我们使用 SWI Prolog
我很难理解这个简单的程序是如何工作的
我有以下解决方案,但我在理解它的声明性含义时遇到了一些问题
读这本书,我觉得我有一些想法,但我不确定......
这是使用连接的解决方案:
sublist(S,L) :- conc(L1, L2, L),
conc(S, L3, L2).
conc([],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
如果第三个列表是第一个和第二个列表的连接,则此解决方案使用另一个响应 TRUE 的小程序。
要说如果 L 的 S i 子列表必须为 TRUE,以下两个条件:
- L 必须是 L1 和 L2 的串联列表
- L2 必须是一个列表,它是 S(我的子列表,如果存在于 L 列表中)和另一个列表 L3 的串联
这是书的解释,但对我来说有点晦涩......
我已经试着去推理它并试图理解它的真正含义......
所以我认为,在某种程度上,它就像使用这个其他程序来搜索一个元素是否是列表的成员:
member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).
在这个程序中,我只是说如果 X 是列表顶部的元素(它的头部),那么 X 在列表中并且程序响应为真。否则,如果 X 元素不在列表顶部(或者它不是我的解决方案),我会尝试在此列表的 TAIL T 中搜索它。
回到子列表程序我觉得道理差不多
首先我将 L 列表分解为两个列表 L1 和 L2(使用 conc 程序)**
然后我检查一下S和L3的串联是否是L2列表。
如果展位这些条件为真,则 S 是 L 的子列表
我认为L1列表与我在成员程序中从列表中提取的X元素的作用相似。
由于子列表 S 可以从列表 L 的开头开始,因此 L1 可以是 [] 并且我可以在 L1=[] 和 L2 的串联中分解 L 并且我可以尝试在 S 中分解 L2和 L3。
如果我能做最后的分解,那么程序结束,我可以说 S 是原始列表 L 的子列表是真的
如果 conc(S, L3, L2) 不正确,则 ddo 回溯并采用另一个计算分支
我的声明式解释对吗?
我在这个例子中发现了很大的困难,我也试图找到一个程序解释(使用 Prolog shell 中的操作跟踪),但我有很大的问题,因为计算量对于一个简短的列表来说也是如此之大.. .
【问题讨论】:
-
您介意使用拼写检查器吗?
标签: prolog declarative