225 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
/**
 | 
						|
 * @file   tries.yap
 | 
						|
 * @author Ricardo Rocha
 | 
						|
 * 
 | 
						|
 * @brief  
 | 
						|
 * 
 | 
						|
 * 
 | 
						|
*/
 | 
						|
/****************************************
 | 
						|
  File:     tries.yap
 | 
						|
  Author:   Ricardo Rocha
 | 
						|
  Comments: Tries module for Yap Prolog
 | 
						|
  version:  $ID$
 | 
						|
****************************************/
 | 
						|
 | 
						|
:- module(tries, [
 | 
						|
		  trie_open/1,
 | 
						|
		  trie_close/1,
 | 
						|
		  trie_close_all/0,
 | 
						|
		  trie_empty/1,
 | 
						|
		  trie_mode/1,
 | 
						|
		  trie_put_entry/3,
 | 
						|
		  trie_check_entry/3,
 | 
						|
		  trie_get_entry/2,
 | 
						|
		  trie_get_first_entry/2,
 | 
						|
		  trie_get_last_entry/2,
 | 
						|
		  trie_traverse/2,
 | 
						|
		  trie_traverse/3,
 | 
						|
		  trie_remove_entry/1,
 | 
						|
		  trie_remove_subtree/1,
 | 
						|
		  trie_join/2,
 | 
						|
		  trie_intersect/2,
 | 
						|
		  trie_count_join/3,
 | 
						|
		  trie_count_intersect/3,
 | 
						|
		  trie_dup/2,
 | 
						|
		  trie_save/2,
 | 
						|
		  trie_load/2,
 | 
						|
		  trie_stats/4,
 | 
						|
		  trie_max_stats/4,
 | 
						|
		  trie_usage/4,
 | 
						|
		  trie_print/1,
 | 
						|
		  open_trie/1,
 | 
						|
		  close_trie/1,
 | 
						|
		  close_all_tries/0,
 | 
						|
		  put_trie_entry/4,
 | 
						|
		  get_trie_entry/3,
 | 
						|
		  remove_trie_entry/1,
 | 
						|
		  print_trie/1,
 | 
						|
          trie_traverse_mode/1,
 | 
						|
          trie_disable_hash/0,
 | 
						|
          trie_enable_hash/0,
 | 
						|
          trie_traverse_first/2,
 | 
						|
          trie_traverse_next/2,
 | 
						|
          trie_to_list/2,
 | 
						|
          trie_to_depth_breadth_trie/4,
 | 
						|
          trie_to_depth_breadth_trie/6,
 | 
						|
          trie_get_depth_breadth_reduction_entry/1,
 | 
						|
          trie_get_depth_breadth_reduction_opt_level_count/2,
 | 
						|
          trie_replace_nested_trie/3
 | 
						|
          ]).
 | 
						|
 | 
						|
/** @defgroup tries Trie DataStructure
 | 
						|
@ingroup library
 | 
						|
@{
 | 
						|
 | 
						|
The next routines provide a set of utilities to create and manipulate
 | 
						|
prefix trees of Prolog terms. Tries were originally proposed to
 | 
						|
implement tabling in Logic Programming, but can be used for other
 | 
						|
purposes. The tries will be stored in the Prolog database and can seen
 | 
						|
as alternative to `assert` and `record` family of
 | 
						|
primitives. Most of these utilities have been implemented in `C`
 | 
						|
for efficiency. They are available through the
 | 
						|
`use_module(library(tries))` command.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
/** @pred trie_check_entry(+ _Trie_,+ _Term_,- _Ref_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Succeeds if a variant of term  _Term_ is in trie  _Trie_. An handle
 | 
						|
 _Ref_ gives a reference to the term.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_close(+ _Id_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Close trie with identifier  _Id_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_close_all 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Close all available tries.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_get_entry(+ _Ref_,- _Term_) 
 | 
						|
 | 
						|
 | 
						|
Unify  _Term_ with the entry for handle  _Ref_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_load(+ _Trie_,+ _FileName_) 
 | 
						|
 | 
						|
 | 
						|
Load trie  _Trie_ from the contents of file  _FileName_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_max_stats(- _Memory_,- _Tries_,- _Entries_,- _Nodes_) 
 | 
						|
 | 
						|
 | 
						|
Give maximal statistics on tries, including the amount of memory,
 | 
						|
 _Memory_, the number of tries,  _Tries_, the number of entries,
 | 
						|
 _Entries_, and the total number of nodes,  _Nodes_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_mode(? _Mode_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Unify  _Mode_ with trie operation mode. Allowed values are either
 | 
						|
`std` (default) or `rev`.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_open(- _Id_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Open a new trie with identifier  _Id_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_print(+ _Trie_) 
 | 
						|
 | 
						|
 | 
						|
Print trie  _Trie_ on standard output.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 */
 | 
						|
/** @pred trie_put_entry(+ _Trie_,+ _Term_,- _Ref_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Add term  _Term_ to trie  _Trie_. The handle  _Ref_ gives
 | 
						|
a reference to the term.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_remove_entry(+ _Ref_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Remove entry for handle  _Ref_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_remove_subtree(+ _Ref_) 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
Remove subtree rooted at handle  _Ref_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_save(+ _Trie_,+ _FileName_) 
 | 
						|
 | 
						|
 | 
						|
Dump trie  _Trie_ into file  _FileName_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_stats(- _Memory_,- _Tries_,- _Entries_,- _Nodes_) 
 | 
						|
 | 
						|
 | 
						|
Give generic statistics on tries, including the amount of memory,
 | 
						|
 _Memory_, the number of tries,  _Tries_, the number of entries,
 | 
						|
 _Entries_, and the total number of nodes,  _Nodes_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
/** @pred trie_usage(+ _Trie_,- _Entries_,- _Nodes_,- _VirtualNodes_) 
 | 
						|
 | 
						|
 | 
						|
Give statistics on trie  _Trie_, the number of entries,
 | 
						|
 _Entries_, and the total number of nodes,  _Nodes_, and the
 | 
						|
number of  _VirtualNodes_.
 | 
						|
 | 
						|
 
 | 
						|
*/
 | 
						|
 | 
						|
:- load_foreign_files([tries], [], init_tries).
 | 
						|
 | 
						|
trie_empty(Trie) :-
 | 
						|
	trie_usage(Trie, 0, 0, _).
 | 
						|
 | 
						|
trie_dup(Trie, CopyTrie) :-
 | 
						|
	trie_open(CopyTrie),
 | 
						|
	trie_join(CopyTrie, Trie).
 | 
						|
 | 
						|
trie_traverse(Trie, Ref) :- 
 | 
						|
	trie_traverse(Trie, 0, Ref).
 | 
						|
 | 
						|
trie_to_depth_breadth_trie(Trie, DepthBreadthTrie, FinalLabel, OptimizationLevel) :-
 | 
						|
  integer(OptimizationLevel),
 | 
						|
  trie_dup(Trie, CopyTrie),
 | 
						|
  trie_open(DepthBreadthTrie),
 | 
						|
  trie_depth_breadth(CopyTrie, DepthBreadthTrie, FinalLabel, OptimizationLevel, 0, _),
 | 
						|
  trie_close(CopyTrie).
 | 
						|
 | 
						|
trie_to_depth_breadth_trie(Trie, DepthBreadthTrie, FinalLabel, OptimizationLevel, StartCounter, EndCounter) :-
 | 
						|
  trie_depth_breadth(Trie, DepthBreadthTrie, FinalLabel, OptimizationLevel, StartCounter, EndCounter).
 |