<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Probabilistic Inference in SWI-Prolog</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Fabrizio</forename><surname>Riguzzi</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Dipartimento di Matematica e Informatica</orgName>
								<orgName type="institution">University of Ferrara</orgName>
								<address>
									<settlement>Ferrara</settlement>
									<country key="IT">Italy</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Jan</forename><surname>Wielemaker</surname></persName>
							<email>j.wielemaker@cs.vu.nl</email>
							<affiliation key="aff1">
								<orgName type="institution">Centrum Wiskunde &amp; Informatica</orgName>
								<address>
									<settlement>Amsterdam</settlement>
									<country key="NL">The Netherlands</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Riccardo</forename><surname>Zese</surname></persName>
							<email>riccardo.zese]@unife.it</email>
							<affiliation key="aff2">
								<orgName type="department">Dipartimento di Ingegneria</orgName>
								<orgName type="institution">University of Ferrara</orgName>
								<address>
									<settlement>Ferrara</settlement>
									<country key="IT">Italy</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Probabilistic Inference in SWI-Prolog</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">D8AC0329F006A69D0E014A67D6AA9498</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-25T07:50+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Probabilistic Logic Programming</term>
					<term>Tabling</term>
					<term>Answer Subsumption</term>
					<term>Logic Programs with Annotated Disjunctions</term>
					<term>Program Transformation</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Probabilistic Logic Programming (PLP) emerged as one of the most prominent approaches to cope with real-world domains. The distribution semantics is one of most used in PLP, as it is followed by many languages, such as Independent Choice Logic, PRISM, pD, Logic Programs with Annotated Disjunctions (LPADs) and ProbLog. A possible system that allows performing inference on LPADs is PITA, which transforms the input LPAD into a Prolog program containing calls to library predicates for handling Binary Decision Diagrams (BDDs). In particular, BDDs are used to compactly encode explanations for goals and efficiently compute their probability. However, PITA needs modedirected tabling (also called tabling with answer subsumption), which has been implemented in SWI-Prolog only recently. This paper shows how SWI-Prolog has been extended to include correct answer subsumption and how the PITA transformation has been changed to use SWI-Prolog implementation.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>Probabilistic Programming (PP) <ref type="bibr" target="#b12">[13]</ref> allows users to define complex probabilistic models and perform inference and learning on them. In fact, many real-world domains can only be represented effectively by exploiting uncertainty. To model complex domains containing many uncertain relationships among their entities, Probabilistic Logic Programming (PLP) <ref type="bibr" target="#b7">[8,</ref><ref type="bibr" target="#b15">16]</ref> has emerged among the PP proposals as one of the most prominent approaches to cope with such relationships.</p><p>In PLP, the distribution semantics <ref type="bibr" target="#b21">[22]</ref> is at the basis of many languages. Examples of languages that follow the distribution semantics are Independent Choice Logic <ref type="bibr" target="#b13">[14]</ref>, PRISM <ref type="bibr" target="#b21">[22]</ref>, Logic Programs with Annotated Disjunctions (LPADs) <ref type="bibr" target="#b27">[28]</ref> and ProbLog <ref type="bibr" target="#b8">[9]</ref>. All these languages have the same expressive power as a theory in one language can be translated into another <ref type="bibr" target="#b6">[7]</ref>. LPADs offer a general syntax as the constructs of all the other languages can be directly encoded in this language.</p><p>The PITA algorithm (for "Probabilistic Inference with Tabling and Answer subsumption"), presented in <ref type="bibr" target="#b17">[18,</ref><ref type="bibr" target="#b18">19,</ref><ref type="bibr" target="#b19">20]</ref>, takes as input an LPAD and builds Binary Decision Diagrams (BDDs) for every subgoal encountered during the derivation of the query. The use of BDDs is due to the fact that they allow an efficient computation of the probability of the query. Specifically, PITA transforms the input LPAD into a normal logic program in which the subgoals have an extra argument storing a BDD that represents the explanations for their answers. As its name implies, PITA uses tabling with answer subsumption to store explanations for a goal.</p><p>Tabling is a logic programming technique for saving time and ensuring termination for programs without function symbols. With tabling, the Prolog interpreter keeps a store of the subgoals encountered in a derivation together with answers to these subgoals. The stored answers are then retrieved in successive calls of the subgoals, to avoid their re-computation and infinite loops.</p><p>PITA is also used in machine learning systems: EMBLEM <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b2">3]</ref> and SLIP-COVER <ref type="bibr" target="#b4">[5]</ref>, performing respectively parameter and structure learning, use PITA for computing the probability of examples.</p><p>Initially, PITA was implemented in the XSB and YAP systems, which allow the use of answer subsumption. We decided to port it to SWI-Prolog in order to exploit the SWISH framework for developing web applications <ref type="bibr" target="#b28">[29]</ref>. This allowed us to develop cplint on SWISH <ref type="bibr" target="#b0">[1]</ref>, a web application for probabilistic logic programming available at http://cplint.eu.</p><p>The porting of PITA to the SWI-Prolog system led to the extension of its tabling implementation to feature answer subsumption as well. With answer subsumption, or mode-directed tabling, the answers for a goal are aggregated when the individual answers are not needed.</p><p>In this paper, we discuss the extension implemented in SWI-Prolog's tabling and present how we modified PITA to cope with the new SWI-Prolog implementation of mode-directed tabling.</p><p>The paper is organized as follows. Section 2 briefly introduces PLP and in particular the LPAD language. Section 3 discusses tabling in SWI-Prolog, while Section 4 illustrates the implementation of answer subsumption. Section 5 presents the PITA algorithm and transformation, and Section 6 its adaptation to SWI-Prolog. Finally, Section 7 concludes the paper.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Probabilistic Logic Programming</head><p>PLP languages under the distribution semantics <ref type="bibr" target="#b21">[22]</ref> have been used to represent a wide variety of domains <ref type="bibr" target="#b0">[1,</ref><ref type="bibr" target="#b1">2,</ref><ref type="bibr" target="#b16">17]</ref>. A program in a language adopting the distribution semantics defines a probability distribution over normal logic programs called worlds. Each normal program is assumed to have a total well-founded model <ref type="bibr" target="#b24">[25]</ref>. Then, the distribution is extended to queries and the probability of a query is obtained by marginalizing the joint distribution of the query and the programs.</p><p>Logic Programs with Annotated Disjunctions (LPADs) <ref type="bibr" target="#b26">[27]</ref> have the most general syntax among PLP languages under the distribution semantics.</p><p>In LPADs, heads of clauses are disjunctions in which each atom is annotated with a probability. An LPAD T is a finite set of clauses: T = {C 1 , . . . , C n }. Each clause C i takes the form: h i1 : Π i1 ; . . . ; h ivi : Π ivi : − b i1 , . . . , b iui , where h i1 , . . . , h ivi are logical atoms, b i1 , . . . , b iui are logical literals and Π i1 , . . . , Π ivi are real numbers in the interval [0, 1] that sum to 1. b i1 , . . . , b iui is indicated with body(C i ). Note that if v i = 1 the clause corresponds to a non-disjunctive clause. We also allow clauses where vi k=1 Π ik &lt; 1: in this case the head of the annotated disjunctive clause implicitly contains an extra atom null that does not appear in the body of any clause and whose annotation is 1 − vi k=1 Π ik . We denote by ground(T ) the grounding of an LPAD T . We present here the semantics of LPADs for the case of no function symbols, for the case of function symbols see <ref type="bibr" target="#b14">[15]</ref>.</p><p>Each grounding C i θ j of a clause C i corresponds to a random variable X ij with values {1, . . . , v i }, i.e., it indicates which head literal is chosen. The random variables X ij are independent of each other. An atomic choice <ref type="bibr" target="#b13">[14]</ref> is a triple (C i , θ j , k) where C i ∈ T , θ j is a substitution that grounds C i and k ∈ {1, . . . , v i } identifies one of the head atoms. In practice (C i , θ j , k) corresponds to an assignment X ij = k.</p><p>A selection σ is a set of atomic choices that, for each clause C i θ j in ground(T ), contains an atomic choice (C i , θ j , k). A selection σ identifies a normal logic program l σ defined as l σ = {(h ik : − body(C i ))θ j |(C i , θ j , k) ∈ σ}. l σ is called a world of T . Since the random variables associated to ground clauses are independent, we can assign a probability to instances: P (l σ ) = (Ci,θj ,k)∈σ Π ik .</p><p>We consider only sound LPADs where, for each selection σ, the well-founded model of the program l σ chosen by σ is two-valued. We write l σ |= q to mean that the query q is true in the well-founded model of the program l σ . Since the well-founded model of each world is two-valued, q can only be true or false in l σ .</p><p>We denote the set of all instances by L T . Let P (l) be the distribution over instances. The probability of a query q given an instance l is P (q|l) = 1 if l |= q and 0 otherwise. The probability of a query q is given by</p><formula xml:id="formula_0">P (q) = l∈L T P (q, l) = l∈L T P (q|l)P (l) = l∈L T :l|=q P (l)<label>(1)</label></formula><p>Example 1. The following LPAD models the appearance of medical symptoms as a consequence of disease. A person may sneeze if he has the flu or if he has hay fever:</p><formula xml:id="formula_1">C 1 = strong sneezing(X) : 0.3 ; moderate sneezing(X) : 0.5 ← flu(X). C 2 = strong sneezing(X) : 0.2 ; moderate sneezing(X) : 0.6 ← hay fever (X). C 3 = flu(bob). C 4 = hay fever (bob).</formula><p>Here clauses C 1 and C 2 have three alternatives in the head of which the one associated to atom null is left implicit. This program has 9 worlds, the query strong sneezing(bob) is true in 5 of them, and P (strong sneezing(bob)</p><formula xml:id="formula_2">) = 0.3 × 0.2 + 0.3 × 0.6 + 0.3 × 0.2 + 0.2 × 0.5 + 0.2 × 0.2 = 0.44.</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Tabling</head><p>Tabling is a logic programming technique for saving time and ensuring termination for programs without function symbols.</p><p>With tabling, the Prolog interpreter keeps a store of the subgoals encountered in a derivation together with answers to these subgoals. If one of the subgoals is encountered again, its answers are retrieved from the store rather than recomputing them. Tabling is implemented in the Prolog systems XSB <ref type="bibr" target="#b23">[24]</ref>, YAP <ref type="bibr" target="#b20">[21]</ref> and SWI-Prolog <ref type="bibr" target="#b29">[30]</ref>.</p><p>Tabling is implemented in SWI-Prolog using delimited control <ref type="bibr" target="#b9">[10]</ref>. Delimited control <ref type="bibr" target="#b5">[6,</ref><ref type="bibr" target="#b10">11]</ref> was originally introduced in functional programming and is based on two operators, implemented in SWI-Prolog with the predicates reset(Goal,Cont,Term1) and shift(Term2). The first executes the goal in Goal and unifies the other two arguments on the basis of the results of calls to shift/1 during the execution of the goal. If Goal calls shift/1, the execution of the goal is interrupted, the rest of its code up to the nearest call to reset/3, called delimited continuation, is represented as a Prolog term and unified with Cont in reset/3, while the value Term2 in shift/1 is unified with Term1 in reset/3. Finally, the execution restarts from the code just after the call to reset/3. Example 2. We report here the example shown in <ref type="bibr" target="#b9">[10]</ref>. Consider the following program: p :-reset(q,Cont,Term1), writeln(Term1), writeln(Cont), writeln('end'). q :-writeln('before shift'), shift('return value'), writeln('after shift').</p><p>shift/1 instantiates Cont with the writeln('after shift') goal and Term1 with the term 'return value' in reset/3. The output of this program is:</p><formula xml:id="formula_3">?-p. before shift return value [$cont$(785488,[])] end</formula><p>As one can see, when entering in q the execution is interrupted by the call to shift/1. The continuation in this case is not called, therefore what follows the call to shift/1 is not executed. If we modify p by replacing writeln(Cont) with call(Cont), then the input would be ?-p. before shift after shift end In this case, continuation is called and, therefore, the goal writeln('after shift') is executed.</p><p>Predicates are declared as tabled using the table/1 directive. Tabled predicates are transformed in order to collect answers. This transformation makes use of the table/2 predicate, which retrieves the table data structure containing the answers to the tabled predicate.</p><p>Example 3. The program on the left is transformed in that shown on the right</p><formula xml:id="formula_4">:-table p/2. p(X,Y) :-p(X,Z), e(Z,Y). p(X,Y) :-e(X,Y). → p(X,Y) :-table(p(X,Y),p_aux(X,Y)). p_aux(X,Y) :-p(X,Z), e(Z,Y). p_aux(X,Y) :-e(X,Y).</formula><p>When a tabled predicate is called, the execution enters in a delimited answer computation starting the reset phase. If this phase succeeds normally, the answer is added to the table of the tabled predicate. If the tabled predicate calls a predicate that is tabled as well, then the computation enters in the shift phase without producing an answer and the first predicate is suspended, capturing the reminder in Cont. At this point the so-called completion phase starts, collecting all the possible continuation, to find answers for the tabled predicate in the reset phase.</p><p>A call to a tabled predicate can be either a leader or a follower: a leader has only non-tabled ancestors in the call graph, while a follower has a tabled ancestor in the call graph. The leader and the followers that are his descendants make up a scheduling component. completion is performed on one component at a time.</p><p>Each component is associated to a global worklist, i.e., a queue of tables. There is a table for each subgoal for the tabled predicates, called call variants, mapping it to a data structure containing its answers, in the form of an answer trie.</p><p>Each table is also associated to a local worklist that is a dequeue containing answers and dependencies. A dependency is a triple formed by a source, a continuation and a target. If collecting answers for a tabled call p requires the answers for a tabled call q (q may be p itself), then p is the target and q is the source. A dependency indicates that, given an answer for the source call q, we can obtain an answer for the target call p by resuming the suspended continuation. The continuation's answer is then unified with p.</p><p>During the completion phase, tables from the global worklist are extracted one at a time and the local worklist of the considered table is used to find all the answers for the corresponding tabled call. During the reset phase, each time an answer is found for a call p, it is added to the list of answers in the table for p and to the left of the dequeue of the local worklist of subgoals calling p, while each time the execution enters in the shift phase a new dependency for p is added to the right of its worklist. Then, pairs (answer, dependency) are extracted from the dequeue of the local worklist to try to find new answers.</p><p>Note that the answer in the pair is an answer for the source predicate. Pairs are created by associating an answer to the dependency that is immediately to its right in the dequeue. After the combination, the answer and the dependency just combined are swapped, moving the answer to the right of the dependency, meaning that their pair have been already tested. Then, answer and dependency from the pair are combined using values in answer to instantiate variables in source, continuation and, eventually, in target, and the predicate in continuation is called to find new answers for the target, i.e., instantiate all the remaining free variables in target. The new answer for target is then added to the answers list in its table and to the left of the dequeue of the local worklists where the predicate is the source of some dependencies. The completion phase stops when all the answers in all the local worklists are on the left of all the dependencies, meaning that all the combinations have been tested and no more answers can be found.</p><p>Note that in the real implementation there are some minor differences with this description due to performance reasons. For example, answers and dependencies in local worklists are considered in homogeneous batches instead of one at a time and the combination of the two batches is performed by means of Cartesian product. Moreover, the batches containing answers contain also answers for predicates different from that in source, however, during the combination if answer and dependency do not match then their combination is discarded.</p><p>When all the answers for the subogoal in the reset phase are found, they are returned by table/2 one at a time to continue the computation of the query.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Mode-Directed Tabling and Answer Subsumption</head><p>As seen in the previous section, plain tabling creates an answer table per call variant and guarantees termination if the created data structures are finite. For example, this allows us to prove whether a graph connects the nodes A and B while the graph is undirected or cyclic. However, it does not allow us to return the path between A and B because an infinite number of such paths can be constructed by going back and forth or following cycles. This limitation also blocks us from obtaining all proofs for a logical theory.</p><p>The above problem is resolved using tabling with answer subsumption, also called mode-directed tabling <ref type="bibr" target="#b23">[24,</ref><ref type="bibr" target="#b25">26]</ref>. In mode-directed tabling, a subset of the predicate arguments defines the call variant while answers for the remaining arguments are aggregated. A classical aggregation is, following the example above, computing the minimum or shortest path. As the minimum can be considered to subsume higher values this technique is also called Answer Subsumption.</p><p>To facilitate PITA, we extended SWI-Prolog's original tabling implementation with mode-directed tabling. The specification was inherited from XSB, B-Prolog and YAP and includes the most generic aggregation function called lattice that allows a user defined predicate to determine the subsumer for the aggregated answer so far and a new answer. The implementation is straight forward. The modified table/1 directive is used to determine the term that is used for call variant detection and compile a combined aggregation predicate that is called for each answer that is added to the table. The answer table has been extended such that each answer in the answer trie can be assigned an aggregated value. The above mentioned generated predicate is called on each answer to maintain the aggregated answer.</p><p>Note that tabling does not guarantee a particular order in which suspended computations are resumed and thus requires the aggregation function to produce the correct result regardless of the order.</p><p>Furthermore, if one mode-directed tabled goal is the follower of another as in the example below where, given the goal p(A), p/1 is the leader and s/1 the follower we get incorrect results because s/1 may succeed multiple times with partial answers.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>:-table p(lattice(or/3)), s(lattice(or/3)). or(A,B,A-B). p(A) :-s(A). s(1). s(2).</head><p>In the initial implementation of mode-directed tabling in SWI-Prolog, the query p(A) succeeded with answer A = 1-2-(1-2) instead of the desired A = (1-2).</p><p>This has been highlighted in <ref type="bibr" target="#b25">[26]</ref> that showed that many implementations of mode-directed tabling produce unsound results. The authors of <ref type="bibr" target="#b25">[26]</ref> thus define a formal semantics for mode-directed tabling that allows the evaluation of the soundness of implementations. For the program above, the semantics returns A = (1-2).</p><p>In the semantics, aggregation is a post-processing step. Real systems aggregate intermediate results during resolution for efficiency and to avoid loops. The authors of <ref type="bibr" target="#b25">[26]</ref> discuss conditions for this greedy strategy to be sound with respect to the theoretical semantics.</p><p>In order to make SWI-Prolog sound, we modified its tabling implementation by creating a new component for every fresh mode-directed tabled goal we encounter. This component is completed before execution of the parent component is resumed with the complete aggregated result. This ensures soundness with respect to the theoretical semantics of <ref type="bibr" target="#b25">[26]</ref>, provided that within the subcomponent we do not encounter a variant of a tabled goal that was started before the subcomponent but has not yet been completed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">PITA</head><p>The PITA system <ref type="bibr" target="#b17">[18,</ref><ref type="bibr" target="#b18">19,</ref><ref type="bibr" target="#b19">20]</ref>  where Probs is a list of floats that stores the parameters in the head of rule R. R, S and Probs are input arguments while Var is an output argument. assert/1 is a builtin Prolog predicate that adds its argument to the program, allowing its dynamic extension.</p><p>The PITA transformation applies to atoms, literals, conjunction of literals and clauses. The transformation for an atom a and a variable D, P IT A(a, D), is a with the variable D added as the last argument. The transformation for a negative literal b = not a, P IT A(b, D), is the expression</p><formula xml:id="formula_5">(P IT A(a, DN ) → not(DN, D); one(D))</formula><p>which is an if-then-else construct in Prolog: if P IT A(a, DN ) evaluates to true, then not(DN, D) is called, otherwise one(D) is called.</p><p>Example 5 (Example 1 Cont.). If we associate the random variables X 11 with (C 1 , {X/bob}, 1), X 12 with (C 1 , {X/bob}, 2), X 13 with (C 1 , {X/bob}, 3) X 21 with (C 2 , {X/bob}, 1), X 22 with (C 2 , {X/bob}, 2) and X 23 with (C 2 , {X/bob}, 3), the BDD corresponding with the set L T for query strong sneezing(bob) is shown in Figure <ref type="figure" target="#fig_1">1</ref>. The probability of the query is computed by following the BDD and is added to the program, where nonvar/1 is an extra-logical predicate that succeeds if its argument is not a variable. We call these zero clauses.</p><p>Such a transformation is used in combination with answer subsumption. Each predicate is tabled and answer subsumption is applied to the BDD argument added by the PITA transformation, defining as lattice the or/3 predicate. This combines every BDD, which corresponds to a different explanation for the call variant of the predicate, in order to compute a final BDD representing the set of all the explanations. If the goal fails, the only BDD returned is the one representing the 0 constant, which leads to the fail of and check/3, otherwise, the zero BDD is disjoint with other BDDs, maintaining unchanged their truth value.</p><p>In this way, negative literals b = not a are handled by first collecting the BDD representing all the explanations for a by means of answer subsumption. The final BDD is then negated to find the BDD for b.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Conclusion</head><p>In this paper we presented an extension of the tabling system of SWI-Prolog for including sound answer subsumption. Moreover, we presented an extension of the PITA transformation, which takes an LPAD program and translates it into a normal program using the tabling implementation of SWI-Prolog. Possible future directions for improving the tabling implementation are sharing tables between threads, incremental tabling, handling negation, improving space and time performance. We will also extend PITA to handle other reasoning types, such as inference and learning for probabilistic abductive logic programs, extending <ref type="bibr" target="#b11">[12]</ref>. In addition, we plan to make a comparison with XSB in terms of performance.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>applies a program transformation to an LPAD to create a normal program that contains calls for manipulating BDDs. In the implementation, these calls provide a Prolog interface to the CUDD 4<ref type="bibr" target="#b22">[23]</ref> C library and use the following predicates5   init, end : for allocation and deallocation of a BDD manager, a data structure used to keep track of the memory for storing BDD nodes; zero(-BDD), one(-BDD), not(+BDDI, -BDDO), and(+BDD1, +BDD2, -BDDO), or(+BDD1, +BDD2, -BDDO): Boolean operations between BDDs; add var(+N Val,+Probs,-Var): addition of a new multi-valued variable with N Val values and parameters Probs; equality(+Var,+Value,-BDD): BDD represents Var=Value, i.e. that the random variable Var is assigned Value in the BDD; ret prob(+BDD,-P): returns the probability of the formula encoded by BDD. As said above, add var(+N Val,+Probs,-Var) adds a new random variable associated to a new instantiation of a rule with N Val head atoms and parameters list Probs. The auxiliary predicate get_var_n/4 is used to wrap add_var/3 and avoid adding a new variable when one already exists for an instantiation. As shown below, a new fact var(R,S,Var) is asserted each time a new random variable is created, where R is an identifier for the LPAD clause, S is a list of constants, one for each variable of the clause, and Var is an integer that identifies the random variable associated with clause R under a particular grounding. The auxiliary predicate has the following definition get_var_n(R,S,Probs,Var):-(var(R,S,Var) -&gt; true ; length(Probs,L), add_var(L,Probs,Var), assert(var(R,S,Var)) ).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. BDD for query strong sneezing(bob) in Example 1.</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_0">http://vlsi.colorado.edu/~fabio/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_1">BDDs are represented in CUDD as pointers to their root node.</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>A non-disjunctive fact C r = h is transformed into the clause</p><p>where the parameters sum to 1, is transformed into the set of clauses P IT A(C r , i) P IT A(C r , i) = get var n(r, S, [Π 1 , . . . , Π n ], V ar), equality(V ar, i, DD), and(DD m , DD, D). for i = 1, . . . , n.</p><p>In the case where the parameters do not sum to one, the clause is first transformed into null : 1 In order to answer queries, the goal prob(Goal,P) is used, which is defined by prob(Goal, P ) ← init, retractall(var( , , )), add bdd arg(Goal, BDD, GoalBDD), (call(GoalBDD) → ret prob(BDD, P ); P = 0.0), end. Predicate equality(+Var,+Value,-BDD) returns a BDD representing the equality Var=Value. Since variables may be multi-valued, an encoding with Boolean variables must be chosen. The encoding used by PITA is the same as that used to translate LPADs into ProbLog proposed in <ref type="bibr" target="#b6">[7]</ref>.</p></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">cplint on SWISH: Probabilistic logical inference with a web browser</title>
		<author>
			<persName><forename type="first">M</forename><surname>Alberti</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Bellodi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Cota</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Zese</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Intell. Artif</title>
		<imprint>
			<biblScope unit="volume">11</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="47" to="64" />
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Probabilistic logical inference on the web</title>
		<author>
			<persName><forename type="first">M</forename><surname>Alberti</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Cota</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Zese</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">AI*IA 2016</title>
				<editor>
			<persName><forename type="first">G</forename><surname>Adorni</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">S</forename><surname>Cagnoni</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">M</forename><surname>Gori</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">M</forename><surname>Maratea</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer International Publishing</publisher>
			<date type="published" when="2016">2016</date>
			<biblScope unit="volume">10037</biblScope>
			<biblScope unit="page" from="351" to="363" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Experimentation of an expectation maximization algorithm for probabilistic logic programs</title>
		<author>
			<persName><forename type="first">E</forename><surname>Bellodi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Intell. Artif</title>
		<imprint>
			<biblScope unit="volume">8</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="3" to="18" />
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Expectation maximization over binary decision diagrams for probabilistic logic programs</title>
		<author>
			<persName><forename type="first">E</forename><surname>Bellodi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Intell. Data Anal</title>
		<imprint>
			<biblScope unit="volume">17</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="343" to="363" />
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Structure learning of probabilistic logic programs by searching the clause space</title>
		<author>
			<persName><forename type="first">E</forename><surname>Bellodi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">15</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="169" to="212" />
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Abstracting control</title>
		<author>
			<persName><forename type="first">O</forename><surname>Danvy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Filinski</surname></persName>
		</author>
		<idno type="DOI">10.1145/91556.91622</idno>
		<ptr target="http://doi.acm.org/10.1145/91556.91622" />
	</analytic>
	<monogr>
		<title level="m">LISP and Functional Programming</title>
				<imprint>
			<date type="published" when="1990">1990</date>
			<biblScope unit="page" from="151" to="160" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Towards digesting the alphabet-soup of statistical relational learning</title>
		<author>
			<persName><forename type="first">L</forename><surname>De Raedt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Demoen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Fierens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Gutmann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Janssens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Kimmig</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Landwehr</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Mantadelis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Meert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Rocha</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Santos Costa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Thon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Vennekens</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">NIPS 2008 Workshop on Probabilistic Programming</title>
				<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Probabilistic Inductive Logic Programming</title>
	</analytic>
	<monogr>
		<title level="j">LNCS</title>
		<editor>De Raedt, L., Frasconi, P., Kersting, K., Muggleton, S.</editor>
		<imprint>
			<biblScope unit="volume">4911</biblScope>
			<date type="published" when="2008">2008</date>
			<publisher>Springer</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">ProbLog: A probabilistic Prolog and its application in link discovery</title>
		<author>
			<persName><forename type="first">L</forename><surname>De Raedt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Kimmig</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Toivonen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">IJCAI</title>
				<editor>
			<persName><forename type="first">M</forename><forename type="middle">M</forename><surname>Veloso</surname></persName>
		</editor>
		<imprint>
			<publisher>AAAI Press/IJCAI</publisher>
			<date type="published" when="2007">2007. 2007</date>
			<biblScope unit="volume">7</biblScope>
			<biblScope unit="page" from="2462" to="2467" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Tabling as a library with delimited control</title>
		<author>
			<persName><forename type="first">B</forename><surname>Desouter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Van Dooren</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Schrijvers</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">15</biblScope>
			<biblScope unit="issue">4-5</biblScope>
			<biblScope unit="page" from="419" to="433" />
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">The theory and practice of first-class prompts</title>
		<author>
			<persName><forename type="first">M</forename><surname>Felleisen</surname></persName>
		</author>
		<idno type="DOI">10.1145/73560.73576</idno>
		<ptr target="http://doi.acm.org/10.1145/73560.73576" />
	</analytic>
	<monogr>
		<title level="m">Conference Record of the Fifteenth Annual ACM Symposium on Principles of Programming Languages</title>
				<editor>
			<persName><forename type="first">J</forename><surname>Ferrante</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">P</forename><surname>Mager</surname></persName>
		</editor>
		<meeting><address><addrLine>San Diego, California, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM Press</publisher>
			<date type="published" when="1988">January 10-13, 1988. 1988</date>
			<biblScope unit="page" from="180" to="190" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Abductive concept learning</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">C</forename><surname>Kakas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">New Generat. Comput</title>
		<imprint>
			<biblScope unit="volume">18</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="243" to="294" />
			<date type="published" when="2000">2000</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<title level="m" type="main">Practical Probabilistic Programming</title>
		<author>
			<persName><forename type="first">A</forename><surname>Pfeffer</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2016">2016</date>
			<publisher>Manning Publications</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">The Independent Choice Logic for modelling multiple agents under uncertainty</title>
		<author>
			<persName><forename type="first">D</forename><surname>Poole</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Artif. Intell</title>
		<imprint>
			<biblScope unit="volume">94</biblScope>
			<biblScope unit="page" from="7" to="56" />
			<date type="published" when="1997">1997</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">The distribution semantics for normal programs with function symbols</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Int. J. Approx. Reason</title>
		<imprint>
			<biblScope unit="volume">77</biblScope>
			<biblScope unit="page" from="1" to="19" />
			<date type="published" when="2016-10">October 2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<monogr>
		<title level="m" type="main">Foundations of Probabilistic Logic Programming</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2018">2018</date>
			<publisher>River Publishers</publisher>
		</imprint>
	</monogr>
	<note>to appear</note>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Probabilistic logic programming on the web</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Bellodi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Lamma</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Zese</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Cota</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Softw.-Pract. Exper</title>
		<imprint>
			<biblScope unit="volume">46</biblScope>
			<biblScope unit="issue">10</biblScope>
			<biblScope unit="page" from="1381" to="1396" />
			<date type="published" when="2016">10 2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Tabling and answer subsumption for reasoning on logic programs with annotated disjunctions</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Swift</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ICLP TC 2010. LIPIcs</title>
				<imprint>
			<publisher>Schloss Dagstuhl -Leibniz-Zentrum fuer Informatik</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="volume">7</biblScope>
			<biblScope unit="page" from="162" to="171" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">The PITA system: Tabling and answer subsumption for reasoning under uncertainty</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Swift</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">11</biblScope>
			<biblScope unit="issue">4-5</biblScope>
			<biblScope unit="page" from="433" to="449" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Well-definedness and efficient inference for probabilistic logic programming under the distribution semantics</title>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Swift</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">13</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="279" to="302" />
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<analytic>
		<title level="a" type="main">The YAP Prolog system</title>
		<author>
			<persName><forename type="first">Santos</forename><surname>Costa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Rocha</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Damas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="issue">1-2</biblScope>
			<biblScope unit="page" from="5" to="34" />
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b21">
	<analytic>
		<title level="a" type="main">A statistical learning method for logic programs with distribution semantics</title>
		<author>
			<persName><forename type="first">T</forename><surname>Sato</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ICLP</title>
				<editor>
			<persName><forename type="first">L</forename><surname>Sterling</surname></persName>
		</editor>
		<imprint>
			<publisher>MIT Press</publisher>
			<date type="published" when="1995">1995. 1995</date>
			<biblScope unit="page" from="715" to="729" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b22">
	<monogr>
		<author>
			<persName><forename type="first">F</forename><surname>Somenzi</surname></persName>
		</author>
		<ptr target="http://vlsi.colorado.edu/~fabio/CUDD/cudd.pdf" />
		<title level="m">CUDD: CU Decision Diagram Package Release 3</title>
				<imprint>
			<date type="published" when="2015">2015</date>
		</imprint>
		<respStmt>
			<orgName>University of Colorado</orgName>
		</respStmt>
	</monogr>
	<note>0.0</note>
</biblStruct>

<biblStruct xml:id="b23">
	<analytic>
		<title level="a" type="main">XSB: Extending prolog with tabled logic programming</title>
		<author>
			<persName><forename type="first">T</forename><surname>Swift</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">S</forename><surname>Warren</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="issue">1-2</biblScope>
			<biblScope unit="page" from="157" to="187" />
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">The well-founded semantics for general logic programs</title>
		<author>
			<persName><forename type="first">A</forename><surname>Van Gelder</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">A</forename><surname>Ross</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">S</forename><surname>Schlipf</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">J. ACM</title>
		<imprint>
			<biblScope unit="volume">38</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="620" to="650" />
			<date type="published" when="1991">1991</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<analytic>
		<title level="a" type="main">Tabling with sound answer subsumption</title>
		<author>
			<persName><forename type="first">A</forename><surname>Vandenbroucke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Piróg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Desouter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Schrijvers</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">16</biblScope>
			<biblScope unit="issue">5-6</biblScope>
			<biblScope unit="page" from="933" to="949" />
			<date type="published" when="2016">2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b26">
	<analytic>
		<title level="a" type="main">Logic Programs With Annotated Disjunctions</title>
		<author>
			<persName><forename type="first">J</forename><surname>Vennekens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Verbaeten</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Bruynooghe</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ICLP 2004. LNCS</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2004">2004</date>
			<biblScope unit="volume">3132</biblScope>
			<biblScope unit="page" from="431" to="445" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b27">
	<analytic>
		<title level="a" type="main">Logic programs with annotated disjunctions</title>
		<author>
			<persName><forename type="first">J</forename><surname>Vennekens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Verbaeten</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Bruynooghe</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ICLP 2004. LNCS</title>
				<editor>
			<persName><forename type="first">B</forename><surname>Demoen</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">V</forename><surname>Lifschitz</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2004">2004</date>
			<biblScope unit="volume">3131</biblScope>
			<biblScope unit="page" from="431" to="445" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b28">
	<analytic>
		<title level="a" type="main">SWISH: SWI-Prolog for sharing</title>
		<author>
			<persName><forename type="first">J</forename><surname>Wielemaker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Lager</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Riguzzi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Workshop on User-Oriented Logic Programming</title>
				<editor>
			<persName><forename type="first">S</forename><surname>Ellmauthaler</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">C</forename><surname>Schulz</surname></persName>
		</editor>
		<meeting><address><addrLine>IULP</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2015">2015. 2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b29">
	<analytic>
		<title level="a" type="main">SWI-Prolog</title>
		<author>
			<persName><forename type="first">J</forename><surname>Wielemaker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Schrijvers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Triska</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Lager</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theor. Pract. Log. Prog</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="issue">1-2</biblScope>
			<biblScope unit="page" from="67" to="96" />
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
