List 按键搜索关联列表

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.

我在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.

?- 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时,第一对成功,而第二对失败。我提供了跟踪失败的屏幕截图。正如保罗所说:新问题→ 新问题。我很乐意回答,但评论不是它的位置,没有正确的格式很难阅读!你说得对,我只是想避免垃圾邮件。不过我会记住的,谢谢!