Prolog Question - 如何生成给定长度的子列表

时间:2010-11-04 08:36:13

标签: prolog backtracking

我希望使用给定属性生成给定列表的所有子列表,它们具有作为参数提及的特定长度,并且它们还具有作为包含元素的给定元素作为参数传递。我已经设法做到了这一点但是在两个谓词的帮助下,并且在最优性方面非常缓慢:

sublist([], []).
sublist([A|T], [A|L]):-
    sublist(T, L).
sublist(T, [_|L]):-
    sublist(T, L).

choose(T, L):-
    sublist(T, L),
    (dimension(2, T); dimension(1, T)),
    belongs(f, T).

在这里,我想通过T谓词的choose参数返回L列表中具有维度2或1且包含f元素的所有子列表。
谓词dimensionmember与预定义谓词length的用法分别相同member
你能否告诉我们我如何在sublist谓词中包含这两个条件,以便程序只构建那些特定的子列表?

1 个答案:

答案 0 :(得分:2)

以下构建长度为MinLen =< Len =< MaxLen的子序列。我不知道您为何重命名lengthmember,所以我将使用原件。 sublist/4会调用您的sublist/2

sublist(Sub,List,MinLen,MaxLen) :-
    between(MinLen,MaxLen,Len),
    length(Sub,Len),
    sublist(Sub,List).

请注意,length会在两个变量上调用,因此您会获得iterative deepening searchchoose/2现在可以定义为

choose(Sub,List) :-
    sublist(Sub,List,1,2),
    member(f,Sub).

这是一个干净的解决方案。如果它不够快,那么将所有条件都滚动到一个谓词中:

choose(Sub,List),
    (Sub = [f] ; Sub = [f,_] ; Sub = [_,f]),
    sublist(Sub,List).