Prolog全成员函数

Prolog全成员函数,prolog,Prolog,我试图编写一个函数,该函数接受两个列表,如果第一个列表中的每个元素在第二个列表中至少出现一次,则返回true。例如: allMember(X, [a,b]). X = [] ; X = [a] ; X = [b] ; X = [a a] ; X = [a b] ; X = [b a] ; X = [b b] ; false. 麻烦的是,在决赛之后;程序无限循环检查每个可能的列表。我怎样才能解决这个问题 allmember([], _). allmember([F

我试图编写一个函数,该函数接受两个列表,如果第一个列表中的每个元素在第二个列表中至少出现一次,则返回true。例如:

allMember(X, [a,b]).  
X = [] ;  
X = [a] ;  
X = [b] ;  
X = [a a] ;  
X = [a b] ;  
X = [b a] ;  
X = [b b] ;  
false.
麻烦的是,在决赛之后;程序无限循环检查每个可能的列表。我怎样才能解决这个问题

allmember([], _).
allmember([F|R], L2) :- length([F|R], Len1),
                        length(L2, Len2),
                        Len1 =< Len2,
                        member(F, L2),
                        allmember(R, L2).
allmember([],389;)。
所有成员([F | R],L2):-长度([F | R],Len1),
长度(L2,Len2),
Len1=
您描述谓词的方式很简单:

my_subset([], _Set) :- !.
my_subset([X|Xs], Set) :-
    memberchk(X, Set),
    my_subset(Xs, Set).
例如,这也是SWI Prolog标准库中的一个示例

但是,您的代码说明了其他内容:

如果L1是L2元素的组合,且长度不超过(包括)L2的长度,则所有成员(L1,L2)
为真

在这里,首先获得最大长度(第二个参数的总长度),然后枚举长度为0的列表到该最大长度,然后对每个列表的每个元素应用
member/2

all_member/2
中的
between/3
提供第一个列表的所有有效长度。
all_member_1/2
中的
member/2
提供了第二个列表中所有可能的元素组合


如果您知道如何精确地使用谓词,那么这可能不是一个足够好的解决方案。例如,尝试最通用的查询,
?-all_成员(L1,L2)
。您需要更具体地说明这一点。

我用以下代码修复了该问题:

find( L, L2, I) :- length(L2, Length2),   
                   range(0, Length2, PossI),
                   member(I, PossI),
                   find1(L, L2, I).

find1([F1|[]], [F1|_], 0).

find1([F1|R1], [F1|R2], 0) :- find(R1, R2, 0).                           

find1(L1, [_|R2], I) :- M is (I-1),
                       find(L1, R2, M).

这两个列表都是有序的吗?@CommuSoft这是个好问题,但从他的样本输出来看,可能不是。不过,仍需要一些澄清。
find( L, L2, I) :- length(L2, Length2),   
                   range(0, Length2, PossI),
                   member(I, PossI),
                   find1(L, L2, I).

find1([F1|[]], [F1|_], 0).

find1([F1|R1], [F1|R2], 0) :- find(R1, R2, 0).                           

find1(L1, [_|R2], I) :- M is (I-1),
                       find(L1, R2, M).