比较Prolog中的两个列表,确定两个列表的相等元素是否相同

时间:2016-11-23 18:01:36

标签: list prolog counting

我刚刚开始学习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).    

1 个答案:

答案 0 :(得分:0)

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

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).