在SWI-Prolog

时间:2019-04-22 22:50:12

标签: python prolog swi-prolog abstract-data-type

因此,我必须实现ADT,在这种情况下,应实现SWI-Prolog中的哈希表。 我需要帮助,因为我是这种编程语言的新手,并且不知道如何开始。

这始于python(3)的实现,在其中定义了一个类并添加了要使用的函数(add,is_empty?,delete,rehash,hash等)。 但是现在,我需要在序言中做类似的事情。

我访问了其他一些类似于我的stackoverflow问题,但我仍然很无奈。

我希望定义一个基本的哈希表,并能够添加键值数据和其他一些基本功能。我不太确定这是否已经在其他地方实现。 请帮助。

2 个答案:

答案 0 :(得分:3)

几个Prolog系统提供内置的术语哈希或库谓词。例如,SWI-Prolog提供term_hash/2term_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中实现哈希表?怎么使用?