因此,我必须实现ADT,在这种情况下,应实现SWI-Prolog中的哈希表。 我需要帮助,因为我是这种编程语言的新手,并且不知道如何开始。
这始于python(3)的实现,在其中定义了一个类并添加了要使用的函数(add,is_empty?,delete,rehash,hash等)。 但是现在,我需要在序言中做类似的事情。
我访问了其他一些类似于我的stackoverflow问题,但我仍然很无奈。
我希望定义一个基本的哈希表,并能够添加键值数据和其他一些基本功能。我不太确定这是否已经在其他地方实现。 请帮助。
答案 0 :(得分:3)
几个Prolog系统提供内置的术语哈希或库谓词。例如,SWI-Prolog提供term_hash/2
和term_hash/4
内置谓词。这些谓词通常与第一参数索引结合在一起。一个简单的例子:
% dynamic predicate to hold hash table entries
% with the term hash used as first argument to
% take advantage of first-argument indexing
%
% hash_table(Hash, Term).
:- dynamic(hash_table/2).
add_hash_table_entry(Term) :-
nonvar(Term),
term_hash(Term, Hash), % or term_hash/4
assertz(hash_table(Hash, Term)).
del_hash_table_entry(Term) :-
nonvar(Term),
term_hash(Term, Hash), % or term_hash/4
retractall(hash_table(Hash, _)).
hash_table_entry(Term) :-
( var(Term) ->
hash_table(_, Term)
; term_hash(Term, Hash), % or term_hash/4
hash_table(Hash, Term)
).
答案 1 :(得分:1)
这听起来像是一个误导的想法。该“哈希表”将如何使用?您期望不同的运算具有什么算法复杂性?为什么要用不需要用户实现的哈希表的语言实现哈希表?
唯一可行的方法是对表使用一个扁平术语,每个存储桶一个参数。如果您有 k 个存储桶,则使用一个具有k的项,因此对于256个存储桶,您将获得hash_table/256
。
empty_hash_table(T) :-
length(Buckets, 256),
maplist(=(nil), Buckets),
T =.. [hash_table|Buckets].
您现在可以使用arg/3
在恒定时间内获取存储桶。您可以使用setarg/3
进行更改。
但是,这一切似乎开始变得非常混乱。您需要更好地说明您的原因。为什么要在Prolog中实现哈希表?怎么使用?