比较 Prolog 中的两个列表,以确定两个列表的相等元素是否具有相同的计数

Comparing two Lists in Prolog, To Determine if the Equal Elements of both lists are the Same Count

我刚刚开始学习Polog,我必须做以下事情 第一的: 我必须编写一个谓词,检查列表 A 是否仅包含 B 所具有的某些元素。 (A=[a,b] B=[a,b,c] 是真的),我这样做了,但我还必须确定两个列表的相等元素是否相同。

Example:
A = [b,b,c,c]     (b and c is member of B so its true)
B = [a,b,b,c,c,d,f,g]   
<--would be true

第一部分写完了,还是要查数。 但我不能使用排序和数字来检查它:[ 老师建议使用 select,但它是可选的

第二个: 我必须向谓词添加另一个表达式,它检查列表 C 是否仅包含 B 所具有的某些元素(与之前的任务相同)。 (C=[a,b] B=[a,b,c] 是真的)(我已经完成了),但我还必须检查 B 的元素是否在 C 中出现了 2 次。

Example:
A = [b,b,c,c]
B = [a,b,b,c,c,d,e,f,g] 
C = [b,b,b,b,c,c,c,c] /or/ C=[a,a,b,b,b,b]
would be true.

EDIT1:到目前为止我写的代码是:

subset([ ],_). 
subset([H|T],List) :-       
    member(H,List),     
    subset(T,List).     



p(A,B,C) :-                    %this is the predicate in which I have to 
    subset(A,B),               %compile everything together
    subset(C,B).    

第一个可以通过删除 B 上出现在 A 中的每个元素并返回剩下的元素来完成,然后我们检查剩余部分不包含 A 中的任何元素(即它们是相同的计数)。

dontIntersect(L1,L2) :-
    intersection(L1,L2,[]).

subset_2([], R, R).

subset_2([H | T], List, R):-
    select(H, List, NewList),
    subset_2(T, NewList, R).

subset(L1, L2):-
    subset_2(L1,L2,Remainder),
    dontIntersect(L1,Remainder).

第二个非常相似,只是我们一次从列表中删除了两个元素。

dontIntersect(L1,L2) :-
    intersection(L1,L2,[]).

subset_2([], R, R).

subset_2([H | T], List, R):-
    select(H, List, NewList1),
    select(H, NewList1, NewList2),
    subset_2(T, NewList2, R).

subset(L1, L2):-
    subset_2(L1,L2,Remainder),
    dontIntersect(L1,Remainder).