2013-02-21 106 views
0

我是C++的家伙,我对prolog完全陌生。 我正在使用sicstus序言。使用散列列表筛选范围

我碰到一个需要如下:

可以说,我有一个变量

A={0,1,2,3} 
B={-2,-1,0,1,2,3,4,5} 

和我有散之类的话像

0-{3} 
1-{4} 

现在我需要过滤A和B的值使用此散列,以便在操作之后:

A={0,1} 
B={3,4} 

逻辑是从A的值将与散列的键匹配

如果键存在,则检查值。如果值存在于B中,则A中的值保留。 否则值应该被删除。 以相同的方式,应该对于B与在散列值来完成建议立即进行删除DBE搜索在A和如果没有的话存在,它应该在B. 为B.

被删除意味着完全相反的方式有谁请帮帮我?

回答

1

我建议你使用列表来保存A和B的键和值,以及一个Key-Value对的列表来保存你的hashmap。这样你可以使用内建帮助谓词include/3memberchk/2来满足你的需求。

然后,你可以写一个过滤器的项目和B的程序:如果你有

A=[0,1,2,3] 
B=[-2,-1,0,1,2,3,4,5] 
Hash=[0-3, 1-4] 

然后

filter(A, B, Hash, FA, FB):- 
    include(filterkey(B, Hash), A, FA), 
    include(filtervalue(A, Hash), B, FB). 

filterkey(B, Hash, Item):- 
    memberchk(Item-Value, Hash), 
    memberchk(Value, B). 

filtervalue(A, Hash, Value):- 
    memberchk(Item-Value, Hash), 
    memberchk(Item, A). 

说:

?- A=[0,1,2,3], B=[-2,-1,0,1,2,3,4,5], Hash=[0-3, 1-4], filter(A, B,Hash, FA, FB). 
Hash = [0-3, 1-4], 
FA = [0, 1], 
FB = [3, 4]. 
0

对不起我没有可用的Sicstus进行测试,然后我可能完全不符合要求,但是您正在处理一个非常不利于012的测试。特殊类型的变量。考虑

?- write_canonical({1,2,3,4}). 
{}(','(1,','(2,','(3,4)))) 

?- {1,2,3,4}={A}. 
A = (1, 2, 3, 4). 

牙套实际上只是一个元组一个特有的名字,和AFAIK使用只是作为句法装置在DSL引入可读数据(领域特定语言),例如像约束库clpqr )。

我的意思是,或

  • 您使用的是错误表示该任务(gusbro解决了这个问题,+1)
  • 你正在寻找一个CLP约束扩展(过滤? )在Sicstus中不可用。但是,这个问题应该以更好的条件重新制定。

反正你能适应gusbro的回答不改变你的程序,如果你添加,例如,

member_set(E, {','(E,_)}). 
member_set(E, {','(_,T)}) :- member_set(E, {T}). 
member_set(E, {E}). 

更换memberchk。 include/3也必须重写,但并不那么容易。 否则,转换谓词

set_list({','(A,B)}, [A|R]) :- set_list({B}, R), !. 
set_list({E}, [E]). 
set_list({}, []). 

可以很方便:

?- set_list(S,[1,2,3]). 
S = {1, 2, 3}. 

?- set_list({1,2,3},L). 
L = [1, 2, 3].