List 按键搜索关联列表
我在swi prolog中实现了一个关联列表,我想检查列表中是否有特定的键。 我正在尝试的代码结构如下所示:List 按键搜索关联列表,list,prolog,associations,List,Prolog,Associations,我在swi prolog中实现了一个关联列表,我想检查列表中是否有特定的键。 我正在尝试的代码结构如下所示: get_assoc(Key,List,Value) -if key exists do this -else do that 但是,它不起作用。是否有具体的方法来执行此操作?该谓词可用于检查已知/接地键的存在: ?- list_to_assoc([foo-bar], Assoc), get_assoc(foo, Assoc, X). X = bar.
get_assoc(Key,List,Value)
-if key exists
do this
-else
do that
但是,它不起作用。是否有具体的方法来执行此操作?该谓词可用于检查已知/接地键的存在:
?- list_to_assoc([foo-bar], Assoc),
get_assoc(foo, Assoc, X).
X = bar.
?- list_to_assoc([foo-bar], Assoc),
get_assoc(baz, Assoc, _).
false.
如果您希望在关联中生成所有密钥:
?- list_to_assoc([foo-bar, baz-1], Assoc),
gen_assoc(Key, Assoc, _). % note gen_assoc/3 not get_assoc/3
Key = foo ;
Key = baz ;
false.
要使assoc成为全局的,您可以使其成为事实,可以在谓词中统一,也可以使用您提到的if/else分支
my_assoc(Assoc) :- list_to_assoc([foo-bar], Assoc).
% or my_assoc(t(foo, bar, -, t, t)).
my_predicate(K, V) :-
my_assoc(Assoc),
gen_assoc(K, Assoc, V).
my_branching_predicate(Out) :-
my_assoc(Assoc),
( get_assoc(foo, Assoc, _)
-> Out = "foo exists"
; Out = "No Such Key"
).
关于同一个问题,我想问一下,是否可以使用关联列表并将其作为全局变量进行更新,我的谓词可以从任何地方访问它。请您单独评论一个问题,以便提供具体的答案。谢谢@Paul,我成功地实现了这两个解决方案。我当前在执行以下代码时面临另一个问题:get_assocLine,Assoc,Value->Value1是Value+1;Value1是1,put_assocLine,Assoc,Value1,Array,当我尝试添加值为1的键3581和值为1的键2619时,第一对成功,而第二对失败。我提供了跟踪失败的屏幕截图。正如保罗所说:新问题→ 新问题。我很乐意回答,但评论不是它的位置,没有正确的格式很难阅读!你说得对,我只是想避免垃圾邮件。不过我会记住的,谢谢!