2016-11-23 134 views
0

我刚开始学习Polog,而且我必须做以下事情 第一个: 我必须编写一个谓词,它检查if列表A仅包含B具有的那些元素中的一些。 (A = [a,b] B = [a,b,c]为真),我这样做了,但我也必须确定两个列表的相等元素是否相同。比较Prolog中的两个列表,以确定这两个列表的等值元素是否相同计数

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倍。

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

你可以发表你已经写好的代码吗? – Rodolfo

回答

0

第一个可以通过在拔下每一个元素,因为它们出现在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). 
+0

谢谢Rodolfo!这正是我想象的解决这个问题的方法,但还不能完全把它放在代码中。我已经提出了你的评论,但只有当我达到15的声望时才会显示出来:]但是,如果我在代码的第二部分存在问题,我会尝试在编辑中解释它,仅需一秒: – Pavels

+0

'[trace] 69? - subset3x([a,b],[a,a,b,b,c])。 ... 退出:(10)select([],[b,c],[b,c])?蠕变** .. 调用:(9)列表:intersection([a,b],[b,c],[])?蠕变 **失败:(9)列出:intersection([a,b],[b,c],[])? ** ' 我强调了这个问题,它在该阶段需要一个空的列表,所以一些符号会被提醒。我正在考虑如何解决这个问题:D – Pavels

+0

NEVERMIND,对不起,这一切正常,当我整合你的代码时,我犯了错误。 无论如何,非常感谢你的朋友:] – Pavels

相关问题