2013-02-21 107 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].