题
我想生成给定列表中的所有子列表,并具有给定属性,它们具有一定的长度为参数,并且它们作为包含元素是给定元素的包含元素,该元素作为参数传递。我设法做到了这一点,但是在两个谓词的帮助下,就最优性而言非常慢:
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
鉴定具有尺寸2或1的L列表中的所有子列表,其中包含 f
元素。
谓词 dimension
和 member
具有与预定义谓词相同的用法 length
, , 分别 member
.
您能告诉我如何将这两个条件纳入 sublist
谓词以使程序仅构建那些特定的统一者?
解决方案
以下构建长度的子序列 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
被称为两个变量,所以您会得到一个 迭代加深搜索. 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).
不隶属于 StackOverflow