<?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">On Teaching Constraint-based Modeling and Algorithms for Decision Support in Prolog</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">François</forename><surname>Fages</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution" key="instit1">Inria Saclay</orgName>
								<orgName type="institution" key="instit2">Ecole Polytechnique</orgName>
								<address>
									<settlement>Palaiseau</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="department">𝑛𝑑 Workshop on Prolog Education</orgName>
								<address>
									<postCode>2024</postCode>
									<settlement>October, Dallas</settlement>
									<country key="US">USA</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">On Teaching Constraint-based Modeling and Algorithms for Decision Support in Prolog</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">F04C57D88962442C5329D0AF984C1571</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T19:52+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>constraint programming</term>
					<term>combinatorial optimization</term>
					<term>algebraic modeling languages</term>
					<term>MiniZinc</term>
					<term>metapredicates</term>
					<term>set comprehension</term>
					<term>answer constraint semantics</term>
					<term>constraint solving</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Constraint programming techniques are particularly successful at solving discrete optimization problems such as resource allocation, scheduling or transport problems which are ubiquitous in the industry. Although historically introduced in the mid 80's with the generalization of Prolog to the class of Constraint Logic Programming languages, those techniques are mainly used today through constraint solving libraries in standard programming languages such as C++, Java, Python, and mainly taught with constraint-based modeling languages such as MiniZinc or Essence, in the tradition of algebraic modeling languages developed for mixed integer linear programming. Nonetheless, the foundations of both constraint solvers and constraint-based models in first-order logic should make of Prolog with its constraint-solving libraries a unique language to teach all aspects of constraint programming, provided missing higher-level MiniZinc-like mathematical modeling language constructs are added to Prolog libraries. This is what I have developed for teaching purposes in SWI-Prolog through a package named modeling. This package contains libraries for defining shorthand functional notations, subscripted variables (arrays in addition to lists), set comprehension (bounded iteration and quantifiers compatible with constraints, in addition to recursion), front-end to constraint solving libraries for shorthand expansions on arrays and reification, and search tree tracing and visualization. This approach makes it possible to teach constraint-based modeling, search programming, and constraint solving with a unique high-level modeling/programming language, Prolog.</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>The problem of placing 𝑁 queens on a chessboard of size 𝑁 × 𝑁 such that they do not attack each other (i.e. not placed on the same column, row or diagonal) is classically modeled and solved in Prolog with a finite domain constraint solver in the framework of Constraint Logic Programming (CLP) <ref type="bibr" target="#b0">[1]</ref>, by</p><p>• creating a list of 𝑁 finite domain decision variables, representing say the queens in each column, with domain 1..𝑁 , representing the rows where they are placed, • and posting disequality constraints between each pair of queens, by double recursion on the list of variables and their tail list.</p><p>However, for a course on constraint-based modeling and solving of combinatorial problems in an engineering school, it is more natural to use mathematical notations on subscripted variables, and set comprehension for posting constraints by iteration on indices rather than by double recursion on lists. This is more in the spirit of mathematical modeling languages, such as algebraic modeling languages developed for mixed integer linear programming, or modeling languages like MiniZinc <ref type="bibr" target="#b1">[2,</ref><ref type="bibr" target="#b2">3]</ref> or Essence <ref type="bibr" target="#b3">[4]</ref> for constraint programming.</p><p>For example, one can compare the following MiniZinc-like model using our SWI-Prolog package named modeling<ref type="foot" target="#foot_0">1</ref>  <ref type="bibr" target="#b4">[5]</ref>, with the classical CLP program to solve the N-queens problem:</p><p>:-use_module(library(modeling)).</p><p>:-use_module(library(clpfd)). The writing of the model using subscripted variables and set comprehension is arguably higher-level, since it does not involve recursion and termination proof, but simply bounded quantification on pairs of indices defined by set comprehension. This is even more striking when it comes to breaking all symetries of the chessboard square, i.e. of the dihedral group of order 8 including reflection symetries around the vertical, horizontal, diagonal, antidiagonal axes and rotation symetries, using lexicographic ordering on the primal and dual models expressed by playing on the indices, rather than by tricky list recursions <ref type="bibr" target="#b4">[5]</ref>.</p><p>MiniZinc was designed with a principle of independence of constraint solvers, in order to compare their performances on common benchmarks of models. A MiniZinc model is usually transformed in a FlatZinc model in which the high-level constructs have been eliminated and replaced by a flat constraint satisfaction problem that can be executed by a variety of constraint solvers parsing FlatZinc syntax. This is the way for instance SICStus-Prolog is interfaced with FlatZinc as a general purpose constraint solver to solve problems modeled in MiniZinc <ref type="bibr" target="#b5">[6]</ref>.</p><p>For teaching purposes however, we are more interested in having a MiniZinc interpreter in Prolog in order to combine pure constraint-based modeling aspects with programming aspects for programming search or data interface. This is possible in Eclipse system <ref type="bibr" target="#b6">[7]</ref> but, to the best of our knowledge, did not exist in the form of Prolog libraries. This was thus our main motivation for developing a modeling pack to introduce functional notations and set comprehension predicates, and write constraint-based mathematical models à la MiniZinc in Prolog.</p><formula xml:id="formula_0">satisfy([Q1,Q2,Q3,Q4]) Q1=1 Q2=3 Q2̸ =3 Q1̸ =1 Q1=2 [2,4,1,3] Q1̸ =2 Q1=3 [3,1,4,2] Q1̸ =3 Q2=1 Q2̸ =1</formula><p>Making these high-level metapredicates available in Prolog for the pure modeling part, makes it possible to combine them with full programming features of Prolog for data interfaces, programming search, representing the search tree by a Prolog term, and visualizing it, a very important feature for teaching constraint programming. Fig. <ref type="figure" target="#fig_1">1</ref> displays the search tree term generated by satisfy/1 predicate with trace option of our modeling library for computing all solutions to queens(4, Q) query.</p><p>The possibility of combining constraint domains and reifying constraints with Boolean variables, also makes of CLP a very expressive modeling language, compared to more traditional algebraic modeling languages developed for linear programming. For example, the computation of magic series (𝑥 1 , . . . , 𝑥 𝑛 ) satisfying the equation</p><formula xml:id="formula_1">∀ 𝑖 ∈ {1, . . . , 𝑛} 𝑥 𝑖 = card {𝑗 ∈ {1, . . . 𝑛} | 𝑥 𝑗 = 𝑖 − 1}</formula><p>i.e. series where 𝑥 𝑖 is the number of occurrences of the value 𝑖 − 1 in the series, can be solved by a quite direct transcription of the mathematical definition of the problem as follows:</p><formula xml:id="formula_2">magic_series(N, X):- array(X, [N]), for_all(I in 1..N, X[I] #= int_sum(J in 1..N, truth_value(X[J] #= I-1))), satisfy(X).</formula><p>?-magic_series(N, X). X = array(1, 2, 1, 0), N = 4 ; X = array(2, 0, 2, 0), N = 4 ; X = array(2, 1, 2, 0, 0), N = 5 ; X = array(3, 2, 1, 1, 0, 0, 0), N = 7 ; X = array(4, 2, 1, 0, 1, 0, 0, 0), N = 8 . X = array(5, 2, 1, 0, 0, 1, 0, 0, 0), N = 9 .</p><p>In this definition, the Boolean truth values in {0, 1} of all constraints 𝑥 𝑗 = 𝑖 − 1 for 1 ≤ 𝑗 ≤ 𝑛 are summed as integers, and the sum is constrained to be equal to 𝑥 𝑖 . That sum is expressed using general-purpose shorthand functional notations introduced for predicates where one argument can be interpreted as a result, here the last argument for constraint int_sum/3 and reification constraint truth_value/2.</p><p>These features added to Prolog with libraries allow us to teach constraint programming techniques in a unique programming environment, by focusing successively • on constraint-based mathematical modeling techniques for a variety of constraint satisfaction problems at a high-level of abstraction, • on general purpose constraint solvers programmed in Prolog for different domains, • and on search procedures including heuristic search and constraint-based local search procedures written as well in Prolog.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Shorthand functional notations</head><p>Mathematical notations necessitate allowing shorthand functional notations in Prolog expressions and goals. We have defined in library(shorthand) some general purpose metapredicates shorthand/3, expand/2, expand/1, to respectively define new shorthand notations, and expanding them in a term or in a goal before executing it. For example, this is the way the Array[Indices] functional notation for subscripted variables is defined in SWI-Prolog in library(array), as a shorthand for V satisfying the predicate cell(Array, Indices, V), by: :-op(100, yf, []). user:shorthand([](Indices, Array), V, cell(Array, Indices, V)) :-!.</p><p>Independently of the particular syntax used in this example, shorthand functional notations can be defined for any predicate in which one argument can be interpreted as a result, e.g. for cell/2 functional notation without using a particular syntax, with respect to the last argument of cell/3 predicate, by: user:shorthand(cell(Array, Indices), V, cell(Array, Indices, V)) :-!.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Comprehension metapredicates with answer constraint semantics</head><p>Most aggregation metapredicates in Prolog are based on a special mechanism introduced by David Warren in <ref type="bibr" target="#b7">[8]</ref> to collect information across backtracking, and illustrated in his seminal paper with the setof(X, P, S) metapredicate, for collecting in 𝑆 the set of instances of 𝑋 such that 𝑃 is provable. In this approach, a non deterministic goal 𝑃 is thus used as generator comprehension by backtracking. This mechanism used for higher-order programming in Prolog <ref type="bibr" target="#b8">[9]</ref>, and quantifiers like forall/3, cannot be used to constrain context variables, since they refer to the success semantics of Prolog, not the answer constraint semantics <ref type="bibr" target="#b0">[1]</ref>.</p><p>We had thus to introduce in library(comprehension) a few metapredicates for generator comprehension by iteration, rather than by backtracking, in order to satisfy the logical semantics of constraints. For example, we introduced a universal quantifier for_all/3 capable of constraing context variables to satisfy the goal for all instances satisfying the condition, similarly to lower-level maplist/2 which requires specifying context and lambda variables explicitly (operational view), but in sharp contrast to ISO Prolog forall/3 metapredicate which merely tests goal satisfiability on all elements:</p><formula xml:id="formula_3">?-L=[A, B, C], forall(member(X, L), 1=X). % satisfiability test for all elements L = [A, B, C]. ?-L=[A, B, C], for_all(X in L, 1=X). % constraint posted for all elements L = [1, 1, 1], A = B, B = C, C = 1. ?-L=[A,B,C], maplist([X]&gt;&gt;(1=X), L). % lambda constraint posted for all elements L = [1, 1, 1], A = B, B = C, C = 1. ?-forall(member(X, [1, 2, 3]), X #&lt; Y). true. ?-for_all(X in [1, 2, 3], X #&lt; Y). clpfd:(Y in 4..sup). ?-maplist({Y}/[X]&gt;&gt;(X #&lt; Y), [1, 2, 3]). clpfd:(Y in 4..sup).</formula><p>We similarly found it useful to introduce a comprehension metapredicate aggregate_for/6 of hopefuly easier use for the students than foldl/n.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Front-end to constraint solving libraries</head><p>We have defined library(clp) as a front-end to clpfd and clpr constraint solving libraries on, respectively, (Z, +, *, ..., #=, #&gt;, ...) and (R, +, *, ..., {=}, {&gt;}, ...). This allows us also to expand shorthand notations in constraints, accept indifferently arrays or lists in the arguments of global constraints, reify clpr constraints with clpfd Boolean variables, and define hybrid constraints.</p><p>Furthermore, the labeling/2 predicate is enriched in this front-end library with a new option for tracing the search tree and visualizing it in different forms (e.g. generating LaTeX tikz used for Fig. <ref type="figure" target="#fig_1">1</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Modeling library</head><p>Finally, library(modeling) defines predicates for creating arrays of Boolean, integer or floating point decision variables, specify their domains using shorthand notations, and solve constraint satisfaction and optimization problems with default search strategies.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Plan of the course</head><p>With this modeling package in Prolog, it is possible to give a course on "Constraint-based modeling and algorithms for decision support in Prolog" at Master level, and in part at Bachelor 3rd year level,</p><p>• by focusing first on constraint-based mathematical modeling techniques for solving various combinatorial problems, through a simple use of the modeling library, • before getting into the foundations in first-order logic of constraint languages and logic programming, • the programming of general purpose constraint solvers,</p><p>• and the study of search procedures.</p><p>One possible plan for the course in this approach is as follows: In such a course, Prolog with modeling pack provides an end-to-end solution to cover the different aspects of constraint programming techniques for knowledge representation and combinatorial optimisation, going from constraint-based modeling to relation-based programming, with their common foundations in first-order logic.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>queens(N, Queens):-queens(N, Queens):-int_array(Queens, [N], 1..N), length(Queens, N), for_all([I in 1..N-1, D in 1..N-I], Queens ins 1..N, (Queens[I] #\= Queens[I+D], safe(Queens), Queens[I] #\= Queens[I+D]+D, label(Queens). Queens[I] #\= Queens[I+D]-D)), satisfy(Queens). safe([]). safe([QI | Tail]) :noattack(Tail, QI, 1), ?-queens(N, Queens). safe(Tail). N = 1, Queens = array(1) ; noattack([], _, _). N = 4, noattack([QJ | Tail], QI, D):-Queens = array(2, 4, 1, 3) ; QI #\= QJ, N = 4, QI #\= QJ + D, Queens = array(3, 1, 4, 2) ; QI #\= QJ -D, N = 5, D1 #= D + 1, Queens = array(1, 3, 5, 2, 4) . noattack(Tail, QI, D1).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Search tree term automatically generated by trace option for enumerating all solutions to the 4 queens problem. The students can see the active use of constraints which have for effect to decrease the domains of the variables and prune the search tree in advance during search, in sharp contrast to a simple "generate and test" program by backtracking, that would generate the 4 4 possible valuations of the variables to find the 2 solutions.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>1 .</head><label>1</label><figDesc>Solving constraint satisfaction problems with general purpose constraint solvers a) Problem modeling with decision variables, domains and constraints b) Solving logical and arithmetical puzzles c) Solving production planning problems 2. Constraint logic programs a) Deductive databases in Datalog b) First-order logic terms, unification algorithm, metaprogramming c) List processing, task scheduling d) Operational semantics of CLP(X) languages and logical semantics 3. Constraint-based modeling and solvers over R a) Fourier's elimination algorithm b) Symbolic answer constraints c) Dantzig's simplex algorithm, Farkas's duality d) Production planning and cost-benefit analysis 4. Constraint-based modeling and solvers over Z a) Domain filtering algorithms b) Reified constraints c) Constraints as closure operators in a domain lattice d) Resource allocation and disjunctive scheduling problems 5. Search heuristic a) Search procedures and meta-interpreters b) Automated theorem proving c) And-choice heuristics d) Or-choice heuristics e) AI planning 6. Symmetry breaking constraints a) Variable symmetries b) Value symmetries c) Valuation symmetries d) Symmetry breaking during search 7. Boolean modeling and SAT solvers a) Boolean models b) Computational complexity classes c) DPLL algorithm d) Conflict driven clause learning e) Phase transition in random SAT 8. Constraint-based local search algorithms a) Constraint violation functions b) Greedy hill climbing c) Random walk d) Simulated annealing e) Tabu search 9. Final comments on effective modeling practices a) Choice of decision variables b) Choice of constraints and their generation c) Choice of search procedure d) Cooperation of constraint solvers e) Creation of global constraints f) Learning constraint-based models from examples</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">https://eu.swi-prolog.org/pack/list?p=modeling</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Acknowledgments</head><p>I acknowledge fruitful discussions with especially Mathieu Hemery, Sylvain Soliman and of course my students over the years.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Constraint logic programming</title>
		<author>
			<persName><forename type="first">J</forename><surname>Jaffar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J.-L</forename><surname>Lassez</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 14th ACM Symposium on Principles of Programming Languages</title>
				<meeting>the 14th ACM Symposium on Principles of Programming Languages<address><addrLine>Munich, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="1987">1987</date>
			<biblScope unit="page" from="111" to="119" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">MiniZinc: Towards a standard CP modelling language</title>
		<author>
			<persName><forename type="first">N</forename><surname>Nethercote</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><forename type="middle">J</forename><surname>Stuckey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Becket</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Brand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><forename type="middle">J</forename><surname>Duck</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Tack</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 13th Int. Conf. on Principles and Practice of Constraint Programming, CP&apos;07</title>
				<meeting>13th Int. Conf. on Principles and Practice of Constraint Programming, CP&apos;07</meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4741</biblScope>
			<biblScope unit="page" from="529" to="543" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<ptr target="http://www.minizinc.org/" />
		<title level="m">MiniZinc web page</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
	<note>The Zinc team</note>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Essence: A constraint language for specifying combinatorial problems</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">M</forename><surname>Frisch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Harvey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Jefferson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Martinez-Hernandez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Miguel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Constraints</title>
		<imprint>
			<biblScope unit="volume">13</biblScope>
			<biblScope unit="page" from="268" to="306" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">A constraint-based mathematical modeling library in prolog with answer constraint semantics</title>
		<author>
			<persName><forename type="first">F</forename><surname>Fages</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-981-97-2300-3_8</idno>
		<ptr target="https://inria.hal.science/hal-04478132.doi:10.1007/978-981-97-2300-3_8" />
	</analytic>
	<monogr>
		<title level="m">17th International Symposium on Functional and Logic Programming</title>
				<meeting><address><addrLine>FLOPS; Kumamoto, Japan</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2024">2024. 2024</date>
			<biblScope unit="volume">14659</biblScope>
			<biblScope unit="page" from="135" to="150" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title/>
		<author>
			<persName><forename type="first">Mats</forename><surname>Carlsson</surname></persName>
		</author>
		<ptr target="https://sicstus.sics.se/" />
	</analytic>
	<monogr>
		<title level="j">Sicstus</title>
		<imprint>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="issue">3</biblScope>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">Constraint Logic Programming using Eclipse</title>
		<author>
			<persName><forename type="first">K</forename><surname>Apt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Wallace</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2006">2006</date>
			<publisher>Cambridge University Press</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Higher-order extensions to Prolog: Are they needed?</title>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">H D</forename><surname>Warren</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Machine Intelligence</title>
		<imprint>
			<biblScope unit="volume">10</biblScope>
			<biblScope unit="page" from="441" to="454" />
			<date type="published" when="1982">1982</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Effcient execution of HiLog in WAM-based prolog implementations</title>
		<author>
			<persName><forename type="first">K</forename><surname>Sagonas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">S</forename><surname>Warren</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 12th International Conference on Logic Programming</title>
				<editor>
			<persName><forename type="first">L</forename><surname>Sterling</surname></persName>
		</editor>
		<meeting>the 12th International Conference on Logic Programming</meeting>
		<imprint>
			<publisher>MIT Press</publisher>
			<date type="published" when="1995">1995</date>
			<biblScope unit="page" from="349" to="363" />
		</imprint>
	</monogr>
</biblStruct>

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