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

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 元素。
谓词 dimensionmember 具有与预定义谓词相同的用法 length, , 分别 member.

您能告诉我如何将这两个条件纳入 sublist 谓词以使程序仅构建那些特定的统一者?

有帮助吗?

解决方案

以下构建长度的子序列 MinLen =< Len =< MaxLen. 。我不知道你为什么更名 lengthmember, ,所以我要使用原件。 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).
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top