Prolog 中的关联列表
Associative Lists in Prolog
我的任务是用列表实现地图。我们定义关联列表如下:
[]
是列表,
k
是键,v
是值,a是关联列表,那么[[k, v] | a]
是关联列表。
所以现在我要写一个谓词,它检查给定的参数是否是一个关联列表。
例如:
?- test([[a,5]]). -> true., ?- test([[1],[2]]). -> false.
我真的很绝望,我希望有人能帮助我
问候
我可以说 associative lists in SWI-Prolog 是作为 AVL 树实现的,而不是点对列表,尽管后者是可能的。
那么,让我们试试你的方法吧。
[] is the list, k is a key, v is a value and a is an associative list, then [[k, v] | a] is an associative list.
一次更正:
我建议 [[ k | v ] | a]
更紧凑 "more associative" )
is_assoc([]).
is_assoc([[K|V] | AL]) :- %corrected 29 apr 2018 19:00 gmt+3
!, is_assoc( AL ).
put(KV, AL, AL0) :-
KV = [K|V],
get(K, AL, V),
remove(KV, AL, AL_KV),
put(KV, AL_KV, AL0).
put(KV, AL, [KV | AL]).
get(K, AL, V):-
member([K|V], AL).
我的任务是用列表实现地图。我们定义关联列表如下:
[]
是列表,
k
是键,v
是值,a是关联列表,那么[[k, v] | a]
是关联列表。
所以现在我要写一个谓词,它检查给定的参数是否是一个关联列表。 例如:
?- test([[a,5]]). -> true., ?- test([[1],[2]]). -> false.
我真的很绝望,我希望有人能帮助我
问候
我可以说 associative lists in SWI-Prolog 是作为 AVL 树实现的,而不是点对列表,尽管后者是可能的。
那么,让我们试试你的方法吧。
[] is the list, k is a key, v is a value and a is an associative list, then [[k, v] | a] is an associative list.
一次更正:
我建议 [[ k | v ] | a]
更紧凑 "more associative" )
is_assoc([]).
is_assoc([[K|V] | AL]) :- %corrected 29 apr 2018 19:00 gmt+3
!, is_assoc( AL ).
put(KV, AL, AL0) :-
KV = [K|V],
get(K, AL, V),
remove(KV, AL, AL_KV),
put(KV, AL_KV, AL0).
put(KV, AL, [KV | AL]).
get(K, AL, V):-
member([K|V], AL).