我是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来说意味着完全相反的方式。
有人可以帮忙吗?
答案 0 :(得分:1)
我建议您使用列表来保存A和B的键和值,以及用于保存哈希映射的Key-Value
对列表。这样您就可以使用内置辅助谓词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]
然后:
?- 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的回答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].