使用哈希类型的列表筛选范围 我是C++的家伙,我对Prolog完全陌生。 我使用的是sicstus prolog

使用哈希类型的列表筛选范围 我是C++的家伙,我对Prolog完全陌生。 我使用的是sicstus prolog,prolog,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} 逻辑是将来自的值与散列的键匹配 如果该键存在,则检查该值。如果该值存在于B中,则A中的值保持不变。 否则,应删除该值。 同样地,应该对B执行此操作,哈希中的值应该在A中搜索,如果不存在,则应该在B中删除。 表示与B完全相反的方式 有人能帮忙吗?我建议您使用

我遇到了如下需求:

假设我有一个变量

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}
逻辑是将来自的值与散列的键匹配

如果该键存在,则检查该值。如果该值存在于B中,则A中的值保持不变。 否则,应删除该值。 同样地,应该对B执行此操作,哈希中的值应该在A中搜索,如果不存在,则应该在B中删除。 表示与B完全相反的方式


有人能帮忙吗?

我建议您使用列表来保存A和B的键和值,使用
键-值对列表来保存hashmap。这样,您就可以使用内置的helper谓词
include/3
memberchk/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]
然后:


很抱歉,我没有Sicstus可供测试,然后我可能会完全偏离轨道,但您正在处理一种非常特殊的变量。考虑

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

?- {1,2,3,4}={A}.
A = (1, 2, 3, 4).
大括号实际上只是元组的一个特殊名称,而AFAIK被用作在DSL(领域特定语言)中引入可读数据的语法工具,例如library()中的实例约束

我的意思是

  • 您对任务使用了错误的表示(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].
?- set_list(S,[1,2,3]).
S = {1, 2, 3}.

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