3

我想生成具有给定属性的给定列表的所有子列表,它们具有作为参数提及的一定长度,并且它们具有作为包含元素的给定元素,该给定元素作为参数传递。我已经设法做到了这一点,但在两个谓词的帮助下,就最优性而言,速度非常慢:

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参数返回 L 列表中维度为 2 或 1 且包含元素的所有子列表。谓词和分别与预定义谓词具有相同的用法。您能否告诉我如何将这两个条件合并到谓词中,以便程序仅构建那些特定的子列表?choosef
dimensionmemberlengthmember

sublist

4

1 回答 1

2

以下构建 length 的子序列MinLen =< Len =< MaxLen。我不知道你为什么重命名lengthand member,所以我将使用原件。sublist/4调用你的sublist/2.

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

请注意,length它调用了两个变量,因此您得到了一个迭代深化搜索choose/2现在可以定义为

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

这是干净的解决方案。如果速度不够快,则将所有条件合并到一个谓词中:

choose(Sub,List),
    (Sub = [f] ; Sub = [f,_] ; Sub = [_,f]),
    sublist(Sub,List).
于 2010-11-04T09:44:39.057 回答