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