Skip to content

Files

Latest commit

81fc0bd · May 21, 2020

History

History
370 lines (228 loc) · 9.31 KB

README.md

File metadata and controls

370 lines (228 loc) · 9.31 KB

Prolog-Library-Collection

A collection of Prolog libraries that have proven useful in various projects. These libraries are intended to extend the functionality that is already available in the SWI-Prolog standard libraries.

Dependencies

Install SWI-Prolog.

Installation

Install this library:

swipl -g 'pack_install(prolog_library_collection)' -t halt

Use

Once installed, modules from this library are loaded as follows:

:- [library(atom_ext)].

Module overview

Module archive_ext

This module extends the standard library archive:

  • archive_extension(?Extension:atom)

    Succeeds if Extension is a default file name extension for an archive filter or format, as declared in library [[media_type]].

  • archive_media_type(?MediaType:media)

    Succeeds if MediaType is the Media Type of an archive filter or format.

  • archive_open(+In:stream, -Archive:blob)

    Opens an archive over all supported and sensible archive filters and formats. This specifically excludes format mtree, which is a plain text format that is almost never used yet leads to many false positives in practice.

Module assoc_ext

This module extends the standard library assoc:

  • merge_assoc(+New:assoc, +Old:assoc, -Merge:assoc)

    Merges two assocs into a new one. If the same key exists in New and Old, the format replaces the latter in Merge. These semantics are inspired by those of the standard library predicate merge_options/3 in library option.

  • transpose_assoc(+Assoc:assoc, -Transposed:assoc)

    Turns an assoc of (key,value) pairs into one with(value,key) pairs.

Module atom_ext

This module provides additional support for working with atoms:

  • atom_capitalize(+Original:atom, ?Capitalized:atom)

    Succeeds if Capitalized is a copt of Orginal where the first character is in upper case (if applicable).

  • atom_ellipsis(+Original:atom, ?MaxLength:between(2,inf), ?Ellipsed:atom)

    Succeeds if Ellipsed is like Original, but has ellipsis applied in order to have MaxLength.

  • atom_postfix(+Original:atom, ?PostFix:atom)

  • atom_postfix(+Original:atom, ?Length:nonneg, ?PostFix:atom)

    Succeeds if Postfix is a postfix of Original consisting of Length characters.

  • atom_prefix(+Original:atom, ?PostFix:atom)

  • atom_prefix(+Original:atom, ?Length:nonneg, ?PostFix:atom)

    Succeeds if Prefix is a prefix of Original consisting of Length characters.

  • atom_strip(+Original:atom, ?Stripped:atom)

  • atom_strip(+Original:atom, +Strip:list(char), ?Stripped:atom)

    Succeeds if Stripped is a copy of Original where leading and trailing characters in Strip have been removed.

  • atom_terminator(+Original:atom, +Terminator:atom, ?Terminated:atom)

    Succeeds if Terminated is a copy of Original which is ensured to end with the Terminator character.

  • atom_truncate(+Original:atom, +MaxLenhgt:noneng, ?Truncated:atom)

    Like atom_prefix/3, but the Truncated atom is the Original atom in case MaxLength exceeds the Original atom length.

call_ext

meta-predicates

closure

code_ext

This module extends support for working with character-denoting numeric codes:

  • put_codes(+Codes:list(code))
  • put_codes(+Out:stream, +Codes:list(code))

conf_ext

This module introduces a generic way for dealing with external configuration files:

  • cli_arguments(-Args:list(opt)) is det.
  • conf_json(-Conf:dict) is det.

counter

csv_ext

Streamed processing of CSV files.

date_time

dcg

Definite Clause Grammars

In directory /dcg you will find a collection of Definite Clause Grammar (DCG) modules.

dcg/dcg_abnf

Advanced Bauckus-Naur Form (ABNF)

While DCGs are nice, they can be a bit verbose for expressing common repetition patterns. To make DCGs that include repetitions less verbose, this module implements variable repetition as defined in [[https://tools.ietf.org/html/rfc5234][RFC 5234: Augmented BNF for Syntax Specifications: ABNF]].

A simple example

Suppose we want to parse sentences, which are non-empty sequences of words:

sentence1([H|T]) -->
  word(H),
  sentece2(T).

sentence2([H|T]) -->
  word(H),
  sentence2(T)
sentence2([]) --> "".

When this module is loaded, the same can be written as follows:

sentence(L) -->
  +(word, L).

definition

variable repetition

Variable repetition is a metasyntactic construct which states that at least M and at most N occurrences of :Dcg_0 must be processed:

'm*n'(?M:nonneg, ?N:nonneg, :Dcg_0)//
specific repetition

Specific repetition is a metasyntactic construct which states that exactly N occurrences of Dcg_0 must be processed:

'#'(?N:nonneg, :Dcg_0)//

Specific repetition is a special case of [[variable repetition]], because #(N, Dcg_0) is the same as 'm*n'(N, N, Dcg_0).

Kleene

Kleene star is a metasyntactic construct which states that zero or more occurrences of Dcg_0 must be processed:

*(?N:nonneg, :Dcg_0)//

Kleene star is a special case of [[variable repetition]], because *(N, Dcg_0) is the same as 'm*n'(_, _, Dcg_0).

Kleene sum

Kleene sum is a metasyntactic construct which states that one or more occurrences of Dcg_0 must be processed:

+(?N:nonneg, :Dcg_0)//

Kleene sum is a special case of [[variable repetition]], because +(N, Dcg_0) is the same as 'm*n'(1, _, Dcg_0).

optional sequence

Optional sequence is a metasyntactic construct which states that Dcg_0 should either be processed once or not at all:

?(:Dcg_0)//

Optional sequence is a special case of [[variable repetition]], because ?(Dcg_0) is the same as 'm*n'(0, 1, Dcg_0).

DCG Meaning Name
#(?N, :Dcg_0)// Process Dcg_0 exactly N times. specific repetition
*(:Dcg_0)// Process Dcg_0 0 or more times. Kleene star
'*n'(?N, :Dcg_0)// Process Dcg_0 at most N times.
+(:Dcg_0)// Process Dcg_0 1 or more times. Kleene sum
?(:Dcg_0)// Process Dcg_0 0 or 1 times. optional sequence
'm*'(?M, :Dcg_0)// Process Dcg_0 at least M times.
'm*n'(?M, ?N, :Dcg_0)// Process Dcg_0 at least M and at most N times. variable repetition

It contains the following modules:

Type Definition
media A compound term of the form media(Super:atom/Sub:atom,Parameters:list(opt))
opt A unary compound term whose predicate letter is an option name and whose argument is a corresponding option value.

dcg/dcg_ext

debug_ext

default

dict

Dictionaries.

dlist

Difference lists.

file_ext

Handling files and directories.

graph/gml

graph/graph_ext

graph/jgf

hash_ext

http/http_client2

http/http_generic

http/http_pagination

http/http_resource

http/http_server

json_ext

This module provides extended JSON support on top of the standard library http/json:

  • json_load(+File:atom, -Structure:dict) is det.

  • json_save(+File:atom, +Structure:dict) is det.

list_ext

math_ext

media_type

nlp/nlp_lang

os_ext

Running external processes, streaming to/from external processes.

pagination

pair_ext

pp

pure

sort_ext

stream_ext

Support for recoding, unpacking, sorting, and hasing streams.

string_ext

task

term_ext

thread_ext

uri_ext

Constructing/decomposing URIs.

xml_ext

This module allows Prolog goals to be called on a stream that encodes an XML DOM:

  • call_on_xml(+In:stream, +Names:list(atom), :Goal_1) is det.

The following predicates allow the encoding of an XML file or stream to be determined:

  • xml_encoding(+In:stream, -Encoding:atom) is semidet.
  • xml_file_encoding(+File:atom, -Encoding:atom) is semidet.

xsd

Support for XML Schema 1.1 Part 2: Datatypes.

  • xsd_date_time/3 for translating between XSD date/time representations and date/time representations as supported by [[https://github.com/wouterbeek/Prolog-Library-Collection][Prolog-Library-Collection]].

  • xsd_date_time_type/1 for checking/enumerating the XSD date/time datatype IRIs.

  • xsd_encode_string//0 a DCG rule for encoding strings of characters according to the restrictions of the XSD string datatype.

  • xsd_numeric_type/1 enumerates XSD numeric datatype IRIs.

  • xsd_strict_subtype/2 and xsd:subtype/2 allow the hierarchy of XSD datatype IRIs to be queried.