我希望使用给定属性生成给定列表的所有子列表,它们具有作为参数提及的特定长度,并且它们还具有作为包含元素的给定元素作为参数传递。我已经设法做到了这一点但是在两个谓词的帮助下,并且在最优性方面非常缓慢:
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
元素的所有子列表。
谓词dimension
和member
与预定义谓词length
的用法分别相同member
。
你能否告诉我们我如何在sublist
谓词中包含这两个条件,以便程序只构建那些特定的子列表?
答案 0 :(得分:2)
以下构建长度为MinLen =< Len =< MaxLen
的子序列。我不知道您为何重命名length
和member
,所以我将使用原件。 sublist/4
会调用您的sublist/2
。
sublist(Sub,List,MinLen,MaxLen) :-
between(MinLen,MaxLen,Len),
length(Sub,Len),
sublist(Sub,List).
请注意,length
会在两个变量上调用,因此您会获得iterative deepening search。 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).