通过关键字搜索关联列表

时间:2019-08-11 00:39:23

标签: list prolog associations swi-prolog

我已经在swi-prolog中实现了关联列表,我想检查列表中是否有特定的键。 我正在尝试的代码结构如下:

get_assoc(Key,List,Value)
-if key exists 
    do this
-else 
    do that

但是,它不起作用。有没有特定的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

该谓词可用于检查已知/地面密钥的存在:

?- list_to_assoc([foo-bar], Assoc),
   get_assoc(foo, Assoc, X).
   X = bar.

?- list_to_assoc([foo-bar], Assoc),
   get_assoc(baz, Assoc, _).
   false.

您是否希望在assoc中生成所有密钥:

?- 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"
    ).