使用哈希类型的列表筛选范围 我是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].