1/* Part of SWI-Prolog 2 3 Author: Jan Wielemaker and Wouter Beek 4 E-mail: J.Wielemaker@vu.nl 5 WWW: http://www.swi-prolog.org 6 Copyright (c) 2016, VU University Amsterdam 7 All rights reserved. 8 9 Redistribution and use in source and binary forms, with or without 10 modification, are permitted provided that the following conditions 11 are met: 12 13 1. Redistributions of source code must retain the above copyright 14 notice, this list of conditions and the following disclaimer. 15 16 2. Redistributions in binary form must reproduce the above copyright 17 notice, this list of conditions and the following disclaimer in 18 the documentation and/or other materials provided with the 19 distribution. 20 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 POSSIBILITY OF SUCH DAMAGE. 33*/ 34 35:- module(rdf11_containers, 36 [ rdf_alt/3, % ?Alt, -Default, -Others 37 rdf_assert_alt/3, % ?Alt, +Default, +Others 38 rdf_assert_alt/4, % ?Alt, +Default, +Others, +G 39 rdf_assert_bag/2, % ?Bag, +Set 40 rdf_assert_bag/3, % ?Bag, +Set, +G 41 rdf_assert_seq/2, % ?Seq, +List 42 rdf_assert_seq/3, % ?Seq, +List, +G 43 rdf_bag/2, % ?Bag, -List 44 rdf_seq/2, % ?Seq, -List 45 rdfs_container/2, % ?Container, -List 46 rdfs_container_membership_property/1, % ?Property 47 rdfs_container_membership_property/2, % ?Property, ?Number 48 rdfs_member/2, % ?Elem, ?Container 49 rdfs_nth0/3 % ?N, ?Container, ?Elem 50 ]). 51:- use_module(library(semweb/rdf_prefixes), 52 [ (rdf_meta)/1, op(_,_,rdf_meta) 53 ]). 54:- use_module(rdf11, 55 [ rdf_default_graph/1, rdf_transaction/1, rdf_create_bnode/1, 56 rdf_assert/4, rdf_equal/2, rdf_is_subject/1, rdf_has/3 57 ]). 58 59:- autoload(library(apply),[maplist/3]). 60:- autoload(library(error),[must_be/2,type_error/2]). 61:- autoload(library(lists),[member/2]). 62:- autoload(library(pairs),[group_pairs_by_key/2,pairs_values/2]).
82:- rdf_meta
83 rdf_alt(r, -, -),
84 rdf_assert_alt(r, r, t),
85 rdf_assert_alt(r, r, t, r),
86 rdf_assert_bag(r, t),
87 rdf_assert_bag(r, t, r),
88 rdf_assert_seq(r, t),
89 rdf_assert_seq(r, t, r),
90 rdf_bag(r, -),
91 rdf_seq(r, -),
92 rdfs_assert_container(r, t),
93 rdfs_assert_container(r, t, r),
94 rdfs_assert_container(r, r, t, r),
95 rdfs_container(r, -),
96 rdfs_container_membership_property(r),
97 rdfs_container_membership_property(r,?),
98 rdfs_member(r, -).
rdf:Alt
with first member
Default and remaining members Others.
Notice that this construct adds no machine-processable semantics but is conventionally used to indicate to a human reader that the numerical ordering of the container membership properties of Container is intended to only be relevant in distinguishing between the first and all non-first members.
Default denotes the default option to take when choosing one of the alternatives container in Container. Others denotes the non-default options that can be chosen from.
116rdf_alt(Alt, Default, Others) :-
117 rdfs_container(Alt, [Default|Others]).
126rdf_assert_alt(Alt, H, T) :- 127 rdf_default_graph(G), 128 rdf_assert_alt(Alt, H, T, G). 129 130rdf_assert_alt(Alt, H, T, G) :- 131 rdfs_assert_container(Alt, rdf:'Alt', [H|T], G).
Notice that this construct adds no machine-processable semantics but is conventionally used to indicate to a human reader that the numerical ordering of the container membership properties of Container is intended to not be significant.
144rdf_bag(Bag, List) :-
145 rdfs_container(Bag, List).
154rdf_assert_bag(Bag, L) :- 155 rdf_default_graph(G), 156 rdf_assert_bag(Bag, L, G). 157 158rdf_assert_bag(Bag, L, G) :- 159 rdfs_assert_container(Bag, rdf:'Bag', L, G).
Notice that this construct adds no machine-processable semantics but is conventionally used to indicate to a human reader that the numerical ordering of the container membership properties of Container is intended to be significant.
173rdf_seq(Seq, L) :-
174 rdfs_container(Seq, L).
180rdf_assert_seq(Seq, L) :- 181 rdf_default_graph(G), 182 rdf_assert_seq(Seq, L, G). 183rdf_assert_seq(Seq, L, G) :- 184 rdfs_assert_container(Seq, rdf:'Seq', L, G).
189rdfs_assert_container(Container, Class, Elems, G) :- 190 must_be(list, Elems), 191 rdf_transaction(rdfs_assert_container_(Container, Class, Elems, G)). 192 193rdfs_assert_container_(Container, Class, Elems, G) :- 194 (var(Container) -> rdf_create_bnode(Container) ; true), 195 rdf_assert(Container, rdf:type, Class, G), 196 rdfs_assert_members(Elems, 1, Container, G). 197 198rdfs_assert_members([], _, _, _). 199rdfs_assert_members([H|T], N1, Resource, G) :- 200 !, 201 rdf_equal(rdf:'_', Prefix), 202 atom_concat(Prefix, N1, P), 203 rdf_assert(Resource, P, H, G), 204 N2 is N1 + 1, 205 rdfs_assert_members(T, N2, Resource, G).
216rdfs_container(Container, List) :- 217 rdf_is_subject(Container), 218 !, 219 findall(N-Elem, rdfs_member0(Container, N, Elem), Pairs), 220 keysort(Pairs, Sorted), 221 group_pairs_by_key(Sorted, GroupedPairs), 222 pairs_values(GroupedPairs, Groups), 223 maplist(member, List, Groups). 224rdfs_container(Container, _) :- 225 type_error(rdf_subject, Container).
233rdfs_container_membership_property(P) :-
234 rdfs_container_membership_property(P, _).
Success of this goal does not imply that Property is present in the database.
244rdfs_container_membership_property(P, N) :- 245 var(P), 246 !, 247 between(1, inf, N), 248 rdf_equal(rdf:'_', Prefix), 249 atom_concat(Prefix, N, P). 250rdfs_container_membership_property(P, N) :- 251 atom(P), 252 rdf_equal(rdf:'_', Prefix), 253 string_concat(Prefix, NumS, P), 254 number_string(N, NumS), 255 integer(N), 256 N >= 0.
rdf(Container, P, Elem)
is true and P is a container
membership property.
264rdfs_member(Elem, Container) :-
265 rdfs_member0(Container, _, Elem).
rdf(Container, P, Elem)
is true and P is the N-th
(0-based) container membership property.
272rdfs_nth0(N, Container, Elem) :-
273 rdfs_member0(Container, N, Elem).
rdfs_member(-,-)
?
292rdfs_member0(Container, N, Elem) :- 293 (nonvar(Container) ; nonvar(Elem)), 294 !, 295 rdf_has(Container, P, Elem), 296 rdfs_container_membership_property(P, N). 297rdfs_member0(Container, N, Elem) :- 298 rdfs_container_membership_property(P, N), 299 rdf_has(Container, P, Elem)
RDF 1.1 Containers
Implementation of the conventional human interpretation of RDF 1.1 containers.
RDF containers are open enumeration structures as opposed to RDF collections or RDF lists which are closed enumeration structures. The same resource may appear in a container more than once. A container may be contained in itself.