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