我已经在swi-prolog
中实现了关联列表,我想检查列表中是否有特定的键。
我正在尝试的代码结构如下:
get_assoc(Key,List,Value)
-if key exists
do this
-else
do that
但是,它不起作用。有没有特定的方法可以做到这一点?
答案 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"
).