View source with raw comments or as raw
   1/*  Part of SWI-Prolog
   2
   3    Author:        Jon Jagger
   4    E-mail:        J.R.Jagger@shu.ac.uk
   5    Copyright (c)  1993-2011, Jon Jagger
   6    All rights reserved.
   7
   8    Redistribution and use in source and binary forms, with or without
   9    modification, are permitted provided that the following conditions
  10    are met:
  11
  12    1. Redistributions of source code must retain the above copyright
  13       notice, this list of conditions and the following disclaimer.
  14
  15    2. Redistributions in binary form must reproduce the above copyright
  16       notice, this list of conditions and the following disclaimer in
  17       the documentation and/or other materials provided with the
  18       distribution.
  19
  20    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24    COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  25    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  26    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  27    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  30    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31    POSSIBILITY OF SUCH DAMAGE.
  32*/
  33
  34:- module(oset, [  oset_is/1,
  35                    oset_union/3,
  36                    oset_int/3,
  37                    oset_diff/3,
  38                    oset_dint/2,
  39                    oset_dunion/2,
  40                    oset_addel/3,
  41                    oset_delel/3,
  42                    oset_power/2
  43                 ]).
  44
  45
  46/** <module> Ordered set manipulation
  47
  48This library defines set operations on sets represented as ordered
  49lists.
  50
  51@author Jon Jagger
  52@deprecated Use the de-facto library ordsets.pl
  53*/
  54
  55
  56%% oset_is(+OSet)
  57%   check that OSet in correct format (standard order)
  58
  59oset_is(-) :- !, fail.    % var filter
  60oset_is([]).
  61oset_is([H|T]) :-
  62    oset_is(T, H).
  63
  64oset_is(-, _) :- !, fail.  % var filter
  65oset_is([], _H).
  66oset_is([H|T], H0) :-
  67    H0 @< H,               % use standard order
  68    oset_is(T, H).
  69
  70
  71
  72%% oset_union(+OSet1, +OSet2, -Union).
  73
  74oset_union([], Union, Union).
  75oset_union([H1|T1], L2, Union) :-
  76    union2(L2, H1, T1, Union).
  77
  78union2([], H1, T1, [H1|T1]).
  79union2([H2|T2], H1, T1, Union) :-
  80    compare(Order, H1, H2),
  81    union3(Order, H1, T1, H2, T2, Union).
  82
  83union3(<, H1, T1,  H2, T2, [H1|Union]) :-
  84    union2(T1, H2, T2, Union).
  85union3(=, H1, T1, _H2, T2, [H1|Union]) :-
  86    oset_union(T1, T2, Union).
  87union3(>, H1, T1,  H2, T2, [H2|Union]) :-
  88    union2(T2, H1, T1, Union).
  89
  90
  91%% oset_int(+OSet1, +OSet2, -Int)
  92%   ordered set intersection
  93
  94oset_int([], _Int, []).
  95oset_int([H1|T1], L2, Int) :-
  96    isect2(L2, H1, T1, Int).
  97
  98isect2([], _H1, _T1, []).
  99isect2([H2|T2], H1, T1, Int) :-
 100    compare(Order, H1, H2),
 101    isect3(Order, H1, T1, H2, T2, Int).
 102
 103isect3(<, _H1, T1,  H2, T2, Int) :-
 104    isect2(T1, H2, T2, Int).
 105isect3(=, H1, T1, _H2, T2, [H1|Int]) :-
 106    oset_int(T1, T2, Int).
 107isect3(>, H1, T1,  _H2, T2, Int) :-
 108    isect2(T2, H1, T1, Int).
 109
 110
 111%% oset_diff(+InOSet, +NotInOSet, -Diff)
 112%   ordered set difference
 113
 114oset_diff([], _Not, []).
 115oset_diff([H1|T1], L2, Diff) :-
 116    diff21(L2, H1, T1, Diff).
 117
 118diff21([], H1, T1, [H1|T1]).
 119diff21([H2|T2], H1, T1, Diff) :-
 120    compare(Order, H1, H2),
 121    diff3(Order, H1, T1, H2, T2, Diff).
 122
 123diff12([], _H2, _T2, []).
 124diff12([H1|T1], H2, T2, Diff) :-
 125    compare(Order, H1, H2),
 126    diff3(Order, H1, T1, H2, T2, Diff).
 127
 128diff3(<,  H1, T1,  H2, T2, [H1|Diff]) :-
 129    diff12(T1, H2, T2, Diff).
 130diff3(=, _H1, T1, _H2, T2, Diff) :-
 131    oset_diff(T1, T2, Diff).
 132diff3(>,  H1, T1, _H2, T2, Diff) :-
 133    diff21(T2, H1, T1, Diff).
 134
 135
 136%% oset_dunion(+SetofSets, -DUnion)
 137%   distributed union
 138
 139oset_dunion([], []).
 140oset_dunion([H|T], DUnion) :-
 141    oset_dunion(T, H, DUnion).
 142
 143oset_dunion([], DUnion, DUnion).
 144oset_dunion([H|T], DUnion0, DUnion) :-
 145    oset_union(H, DUnion0, DUnion1),
 146    oset_dunion(T, DUnion1, DUnion).
 147
 148
 149%% oset_dint(+SetofSets, -DInt)
 150%   distributed intersection
 151
 152oset_dint([], []).
 153oset_dint([H|T], DInt) :-
 154    dint(T, H, DInt).
 155
 156dint([], DInt, DInt).
 157dint([H|T], DInt0, DInt) :-
 158    oset_int(H, DInt0, DInt1),
 159    dint(T, DInt1, DInt).
 160
 161
 162%!  oset_power(+Set, -PSet)
 163%
 164%   True when PSet is the powerset of Set. That is, Pset is a set of
 165%   all subsets of Set, where each subset is a proper ordered set.
 166
 167oset_power(S, PSet) :-
 168    reverse(S, R),
 169    pset(R, [[]], PSet0),
 170    sort(PSet0, PSet).
 171
 172% The powerset of a set  is  the  powerset   of  a  set  of one smaller,
 173% together with the set of one  smaller   where  each subset is extended
 174% with the new element.  Note that this produces the elements of the set
 175% in reverse order.  Hence the reverse in oset_power/2.
 176
 177pset([], PSet, PSet).
 178pset([H|T], PSet0, PSet) :-
 179    happ(PSet0, H, PSet1),
 180    pset(T, PSet1, PSet).
 181
 182happ([], _, []).
 183happ([S|Ss], H, [[H|S],S|Rest]) :-
 184    happ(Ss, H, Rest).
 185
 186
 187
 188%% oset_addel(+Set, +El, -Add)
 189%   ordered set element addition
 190
 191oset_addel([], El, [El]).
 192oset_addel([H|T], El, Add) :-
 193    compare(Order, H, El),
 194    addel(Order, H, T, El, Add).
 195
 196addel(<, H, T,  El, [H|Add]) :-
 197    oset_addel(T, El, Add).
 198addel(=, H, T, _El, [H|T]).
 199addel(>, H, T,  El, [El,H|T]).
 200
 201
 202%% oset_delel(+Set, +El, -Del)
 203%   ordered set element deletion
 204
 205oset_delel([], _El, []).
 206oset_delel([H|T], El, Del) :-
 207    compare(Order, H, El),
 208    delel(Order, H, T, El, Del).
 209
 210delel(<,  H, T,  El, [H|Del]) :-
 211    oset_delel(T, El, Del).
 212delel(=, _H, T, _El, T).
 213delel(>,  H, T, _El, [H|T]).