使用散列类型的列表过滤范围

时间:2013-02-21 13:00:28

标签: prolog

我是c ++的家伙,我对prolog完全不熟悉。 我正在使用sicstus prolog。

我遇到了以下需求:

假设我有一个变量

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进行处理,其中哈希值中的值在A中搜索,如果不存在则应该在B中删除。 对于B来说意味着完全相反的方式。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我建议您使用列表来保存A和B的键和值,以及用于保存哈希映射的Key-Value对列表。这样您就可以使用内置辅助谓词include/3memberchk/2来满足您的需求。

然后你可以写一个过滤A和B项目的程序:

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]

然后:

?- 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].

答案 1 :(得分:0)

对不起,我没有Sicstus可供测试,然后我可能完全脱离轨道,但你正在处理非常特有的变量。考虑

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

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

大括号实际上只是元组的一个特殊名称,而AFAIK只是用作语法设备来在DSL(域特定语言)中引入可读数据,例如库中的约束({ {3}})。

我的意思是那个或

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

无论如何,如果添加

,你可以调整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].