<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:www.nabble.com,2006:forum-14116</id>
	<title>Nabble - Mercury</title>
	<updated>2008-12-02T21:05:09Z</updated>
	<link rel="self" type="application/atom+xml" href="http://www.nabble.com/Mercury-f14116.xml" />
	<link rel="alternate" type="text/html" href="http://www.nabble.com/Mercury-f14116.html" />
	<subtitle type="html">Mercury is a new logic/functional programming language, which combines the clarity and expressiveness of declarative programming with advanced static analysis and error detection features. Mercury home is &lt;a href=&quot;http://www.cs.mu.oz.au/research/mercury/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.</subtitle>
	
<entry>
	<id>tag:www.nabble.com,2006:post-20806956</id>
	<title>diff: fix context disagreement bug</title>
	<published>2008-12-02T21:05:09Z</published>
	<updated>2008-12-02T21:05:09Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">compiler/prog_io.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix an old bug: don't insist that two parts of the same field access
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goal have the same context.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Always get the context for field access goals from the ^ character.
&lt;br&gt;&lt;br&gt;tests/hard_coded/field_access.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Modify this old test case by giving different parts of a field access
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; different contexts. The old version of the compiler mistakenly rejects
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; it, but the fixed version accepts it.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;&lt;br&gt;cvs diff: Diffing .
&lt;br&gt;cvs diff: Diffing analysis
&lt;br&gt;cvs diff: Diffing bindist
&lt;br&gt;cvs diff: Diffing boehm_gc
&lt;br&gt;cvs diff: Diffing boehm_gc/Mac_files
&lt;br&gt;cvs diff: Diffing boehm_gc/cord
&lt;br&gt;cvs diff: Diffing boehm_gc/cord/private
&lt;br&gt;cvs diff: Diffing boehm_gc/doc
&lt;br&gt;cvs diff: Diffing boehm_gc/include
&lt;br&gt;cvs diff: Diffing boehm_gc/include/private
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/doc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/hpc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/ibmc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/icc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/msftc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/sunc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/tests
&lt;br&gt;cvs diff: Diffing boehm_gc/tests
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc60
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc70
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc71
&lt;br&gt;cvs diff: Diffing browser
&lt;br&gt;cvs diff: Diffing bytecode
&lt;br&gt;cvs diff: Diffing compiler
&lt;br&gt;Index: compiler/prog_io.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/prog_io.m,v
&lt;br&gt;retrieving revision 1.296
&lt;br&gt;diff -u -b -r1.296 prog_io.m
&lt;br&gt;--- compiler/prog_io.m	3 Dec 2008 05:01:40 -0000	1.296
&lt;br&gt;+++ compiler/prog_io.m	3 Dec 2008 05:02:50 -0000
&lt;br&gt;@@ -2197,15 +2197,14 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;desugar_field_access(Term) = DesugaredTerm :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = functor(atom(&amp;quot;^&amp;quot;), [A, RHS], _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHS &amp;nbsp;= functor(atom(FieldName), Bs, Context)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = functor(atom(&amp;quot;^&amp;quot;), [A, RHS], Context),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHS &amp;nbsp;= functor(atom(FieldName), Bs, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DesugaredTerm = functor(atom(FieldName), Bs ++ [A], Context)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX We shouldn't insist on the context of LHS and RHS being the same.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = functor(atom(&amp;quot;:=&amp;quot;), [LHS, X], _),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LHS &amp;nbsp;= functor(atom(&amp;quot;^&amp;quot;), [A, RHS], Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHS &amp;nbsp;= functor(atom(FieldName), Bs, Context)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHS &amp;nbsp;= functor(atom(FieldName), Bs, _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FunctionName = FieldName ++ &amp;quot; :=&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DesugaredTerm = functor(atom(FunctionName), Bs ++ [A, X], Context)
&lt;br&gt;cvs diff: Diffing compiler/notes
&lt;br&gt;cvs diff: Diffing debian
&lt;br&gt;cvs diff: Diffing debian/patches
&lt;br&gt;cvs diff: Diffing deep_profiler
&lt;br&gt;cvs diff: Diffing deep_profiler/notes
&lt;br&gt;cvs diff: Diffing doc
&lt;br&gt;cvs diff: Diffing extras
&lt;br&gt;cvs diff: Diffing extras/base64
&lt;br&gt;cvs diff: Diffing extras/cgi
&lt;br&gt;cvs diff: Diffing extras/complex_numbers
&lt;br&gt;cvs diff: Diffing extras/complex_numbers/samples
&lt;br&gt;cvs diff: Diffing extras/complex_numbers/tests
&lt;br&gt;cvs diff: Diffing extras/concurrency
&lt;br&gt;cvs diff: Diffing extras/curs
&lt;br&gt;cvs diff: Diffing extras/curs/samples
&lt;br&gt;cvs diff: Diffing extras/curses
&lt;br&gt;cvs diff: Diffing extras/curses/sample
&lt;br&gt;cvs diff: Diffing extras/dynamic_linking
&lt;br&gt;cvs diff: Diffing extras/error
&lt;br&gt;cvs diff: Diffing extras/fixed
&lt;br&gt;cvs diff: Diffing extras/gator
&lt;br&gt;cvs diff: Diffing extras/gator/generations
&lt;br&gt;cvs diff: Diffing extras/gator/generations/1
&lt;br&gt;cvs diff: Diffing extras/graphics
&lt;br&gt;cvs diff: Diffing extras/graphics/easyx
&lt;br&gt;cvs diff: Diffing extras/graphics/easyx/samples
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/examples
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/samples
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/samples/demo
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/samples/mandel
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/samples/pendulum2
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_allegro/samples/speed
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_glut
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_opengl
&lt;br&gt;cvs diff: Diffing extras/graphics/mercury_tcltk
&lt;br&gt;cvs diff: Diffing extras/graphics/samples
&lt;br&gt;cvs diff: Diffing extras/graphics/samples/calc
&lt;br&gt;cvs diff: Diffing extras/graphics/samples/gears
&lt;br&gt;cvs diff: Diffing extras/graphics/samples/maze
&lt;br&gt;cvs diff: Diffing extras/graphics/samples/pent
&lt;br&gt;cvs diff: Diffing extras/lazy_evaluation
&lt;br&gt;cvs diff: Diffing extras/lex
&lt;br&gt;cvs diff: Diffing extras/lex/samples
&lt;br&gt;cvs diff: Diffing extras/lex/tests
&lt;br&gt;cvs diff: Diffing extras/log4m
&lt;br&gt;cvs diff: Diffing extras/logged_output
&lt;br&gt;cvs diff: Diffing extras/moose
&lt;br&gt;cvs diff: Diffing extras/moose/samples
&lt;br&gt;cvs diff: Diffing extras/moose/tests
&lt;br&gt;cvs diff: Diffing extras/mopenssl
&lt;br&gt;cvs diff: Diffing extras/morphine
&lt;br&gt;cvs diff: Diffing extras/morphine/non-regression-tests
&lt;br&gt;cvs diff: Diffing extras/morphine/scripts
&lt;br&gt;cvs diff: Diffing extras/morphine/source
&lt;br&gt;cvs diff: Diffing extras/net
&lt;br&gt;cvs diff: Diffing extras/odbc
&lt;br&gt;cvs diff: Diffing extras/posix
&lt;br&gt;cvs diff: Diffing extras/posix/samples
&lt;br&gt;cvs diff: Diffing extras/quickcheck
&lt;br&gt;cvs diff: Diffing extras/quickcheck/tutes
&lt;br&gt;cvs diff: Diffing extras/references
&lt;br&gt;cvs diff: Diffing extras/references/samples
&lt;br&gt;cvs diff: Diffing extras/references/tests
&lt;br&gt;cvs diff: Diffing extras/solver_types
&lt;br&gt;cvs diff: Diffing extras/solver_types/library
&lt;br&gt;cvs diff: Diffing extras/trailed_update
&lt;br&gt;cvs diff: Diffing extras/trailed_update/samples
&lt;br&gt;cvs diff: Diffing extras/trailed_update/tests
&lt;br&gt;cvs diff: Diffing extras/windows_installer_generator
&lt;br&gt;cvs diff: Diffing extras/windows_installer_generator/sample
&lt;br&gt;cvs diff: Diffing extras/windows_installer_generator/sample/images
&lt;br&gt;cvs diff: Diffing extras/xml
&lt;br&gt;cvs diff: Diffing extras/xml/samples
&lt;br&gt;cvs diff: Diffing extras/xml_stylesheets
&lt;br&gt;cvs diff: Diffing java
&lt;br&gt;cvs diff: Diffing java/runtime
&lt;br&gt;cvs diff: Diffing library
&lt;br&gt;cvs diff: Diffing mdbcomp
&lt;br&gt;cvs diff: Diffing profiler
&lt;br&gt;cvs diff: Diffing robdd
&lt;br&gt;cvs diff: Diffing runtime
&lt;br&gt;cvs diff: Diffing runtime/GETOPT
&lt;br&gt;cvs diff: Diffing runtime/machdeps
&lt;br&gt;cvs diff: Diffing samples
&lt;br&gt;cvs diff: Diffing samples/c_interface
&lt;br&gt;cvs diff: Diffing samples/c_interface/c_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/c_interface/mercury_calls_c
&lt;br&gt;cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
&lt;br&gt;cvs diff: Diffing samples/c_interface/mercury_calls_fortran
&lt;br&gt;cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/c_interface/standalone_c
&lt;br&gt;cvs diff: Diffing samples/diff
&lt;br&gt;cvs diff: Diffing samples/muz
&lt;br&gt;cvs diff: Diffing samples/rot13
&lt;br&gt;cvs diff: Diffing samples/solutions
&lt;br&gt;cvs diff: Diffing samples/solver_types
&lt;br&gt;cvs diff: Diffing samples/tests
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
&lt;br&gt;cvs diff: Diffing samples/tests/diff
&lt;br&gt;cvs diff: Diffing samples/tests/muz
&lt;br&gt;cvs diff: Diffing samples/tests/rot13
&lt;br&gt;cvs diff: Diffing samples/tests/solutions
&lt;br&gt;cvs diff: Diffing samples/tests/toplevel
&lt;br&gt;cvs diff: Diffing scripts
&lt;br&gt;cvs diff: Diffing slice
&lt;br&gt;cvs diff: Diffing ssdb
&lt;br&gt;cvs diff: Diffing tests
&lt;br&gt;cvs diff: Diffing tests/analysis
&lt;br&gt;cvs diff: Diffing tests/analysis/ctgc
&lt;br&gt;cvs diff: Diffing tests/analysis/excp
&lt;br&gt;cvs diff: Diffing tests/analysis/ext
&lt;br&gt;cvs diff: Diffing tests/analysis/sharing
&lt;br&gt;cvs diff: Diffing tests/analysis/table
&lt;br&gt;cvs diff: Diffing tests/analysis/trail
&lt;br&gt;cvs diff: Diffing tests/analysis/unused_args
&lt;br&gt;cvs diff: Diffing tests/benchmarks
&lt;br&gt;cvs diff: Diffing tests/debugger
&lt;br&gt;cvs diff: Diffing tests/debugger/declarative
&lt;br&gt;cvs diff: Diffing tests/dppd
&lt;br&gt;cvs diff: Diffing tests/general
&lt;br&gt;cvs diff: Diffing tests/general/accumulator
&lt;br&gt;cvs diff: Diffing tests/general/string_format
&lt;br&gt;cvs diff: Diffing tests/general/structure_reuse
&lt;br&gt;cvs diff: Diffing tests/grade_subdirs
&lt;br&gt;cvs diff: Diffing tests/hard_coded
&lt;br&gt;Index: tests/hard_coded/field_syntax.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/tests/hard_coded/field_syntax.m,v
&lt;br&gt;retrieving revision 1.1
&lt;br&gt;diff -u -b -r1.1 field_syntax.m
&lt;br&gt;--- tests/hard_coded/field_syntax.m	16 Jan 2003 02:34:35 -0000	1.1
&lt;br&gt;+++ tests/hard_coded/field_syntax.m	3 Dec 2008 01:00:41 -0000
&lt;br&gt;@@ -35,7 +35,20 @@
&lt;br&gt;&amp;nbsp;:- func (array(T) ^ elem_from_end(int) := T) &amp;nbsp;= array(T).
&lt;br&gt;&amp;nbsp;:- mode (array_di ^ elem_from_end(in) &amp;nbsp;:= in) = array_uo is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-(A ^ elem_from_end(I) := X) = (A ^ elem(max(A) - I) := X).
&lt;br&gt;+% This formatting gives each part of the term a different context.
&lt;br&gt;+% This is a regression test for a bug in which the code that recognized
&lt;br&gt;+% field accesses insisted on the same context for parts of the term.
&lt;br&gt;+(A
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;^
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;elem_from_end(I)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:=
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;X)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(A
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;^
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;elem(max(A) - I)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:=
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;X).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;
&lt;br&gt;cvs diff: Diffing tests/hard_coded/exceptions
&lt;br&gt;cvs diff: Diffing tests/hard_coded/purity
&lt;br&gt;cvs diff: Diffing tests/hard_coded/sub-modules
&lt;br&gt;cvs diff: Diffing tests/hard_coded/typeclasses
&lt;br&gt;cvs diff: Diffing tests/invalid
&lt;br&gt;cvs diff: Diffing tests/invalid/purity
&lt;br&gt;cvs diff: Diffing tests/misc_tests
&lt;br&gt;cvs diff: Diffing tests/mmc_make
&lt;br&gt;cvs diff: Diffing tests/mmc_make/lib
&lt;br&gt;cvs diff: Diffing tests/par_conj
&lt;br&gt;cvs diff: Diffing tests/recompilation
&lt;br&gt;cvs diff: Diffing tests/tabling
&lt;br&gt;cvs diff: Diffing tests/term
&lt;br&gt;cvs diff: Diffing tests/trailing
&lt;br&gt;cvs diff: Diffing tests/valid
&lt;br&gt;cvs diff: Diffing tests/warnings
&lt;br&gt;cvs diff: Diffing tools
&lt;br&gt;cvs diff: Diffing trace
&lt;br&gt;cvs diff: Diffing util
&lt;br&gt;cvs diff: Diffing vim
&lt;br&gt;cvs diff: Diffing vim/after
&lt;br&gt;cvs diff: Diffing vim/ftplugin
&lt;br&gt;cvs diff: Diffing vim/syntax
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;mercury-reviews mailing list
&lt;br&gt;Post messages to: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=20806956&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Administrative Queries: &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=20806956&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-mercury-reviews@...&lt;/a&gt;
&lt;br&gt;Subscriptions: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=20806956&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mercury-reviews-request@...&lt;/a&gt;
&lt;br&gt;--------------------------------------------------------------------------
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/Mercury---Reviews-f14121.html&quot; embed=&quot;fixTarget[14121]&quot; target=&quot;_top&quot; &gt;Mercury - Reviews&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/diff%3A-fix-context-disagreement-bug-tp20806956p20806956.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-20806950</id>
	<title>diff: prog_io_{mode,type}_defn.m</title>
	<published>2008-12-02T21:01:01Z</published>
	<updated>2008-12-02T21:01:01Z</updated>
	<author>
		<name>Zoltan Somogyi-2</name>
	</author>
	<content type="html">Hopefully finish the breakup of the monster module prog_io.m. It is now way
&lt;br&gt;out of the list of the ten biggest modules. More important, it now has much
&lt;br&gt;more coherence: it consists mainly of 
&lt;br&gt;&lt;br&gt;- the top level loop for reading in items, and
&lt;br&gt;- the code for parsing predicate, function and mode declarations.
&lt;br&gt;&lt;br&gt;There are still some other misc things that don't fit here (e.g. checking insts
&lt;br&gt;for consistency), but they don't fit that well in other modules either.
&lt;br&gt;&lt;br&gt;compiler/prog_io.m:
&lt;br&gt;compiler/prog_io_mode_defn.m:
&lt;br&gt;compiler/prog_io_type_defn.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Move the code in prog_io.m for dealing with definitions of insts, modes
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and types into two new modules.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Delete some obsolete comments at the top of prog_io.m..
&lt;br&gt;&lt;br&gt;compiler/prog_io_util.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Move some generic stuff for dealing with declaration attributes and
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (nonsupported) conditions here from prog_io.m, since the module
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; prog_io_type_defn.m also needs them.
&lt;br&gt;&lt;br&gt;compiler/parse_tree.m:
&lt;br&gt;compiler/notes/compiler_design.html:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add the new modules.
&lt;br&gt;&lt;br&gt;compiler/*.m:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Import the new modules where needed.
&lt;br&gt;&lt;br&gt;Zoltan.
&lt;br&gt;&lt;br&gt;cvs diff: Diffing .
&lt;br&gt;cvs diff: Diffing analysis
&lt;br&gt;cvs diff: Diffing bindist
&lt;br&gt;cvs diff: Diffing boehm_gc
&lt;br&gt;cvs diff: Diffing boehm_gc/Mac_files
&lt;br&gt;cvs diff: Diffing boehm_gc/cord
&lt;br&gt;cvs diff: Diffing boehm_gc/cord/private
&lt;br&gt;cvs diff: Diffing boehm_gc/doc
&lt;br&gt;cvs diff: Diffing boehm_gc/include
&lt;br&gt;cvs diff: Diffing boehm_gc/include/private
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/doc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/hpc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/ibmc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/icc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/msftc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/sunc
&lt;br&gt;cvs diff: Diffing boehm_gc/libatomic_ops-1.2/tests
&lt;br&gt;cvs diff: Diffing boehm_gc/tests
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc60
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc70
&lt;br&gt;cvs diff: Diffing boehm_gc/windows-untested/vc71
&lt;br&gt;cvs diff: Diffing browser
&lt;br&gt;cvs diff: Diffing bytecode
&lt;br&gt;cvs diff: Diffing compiler
&lt;br&gt;Index: compiler/parse_tree.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/parse_tree.m,v
&lt;br&gt;retrieving revision 1.19
&lt;br&gt;diff -u -b -r1.19 parse_tree.m
&lt;br&gt;--- compiler/parse_tree.m	2 Dec 2008 04:30:24 -0000	1.19
&lt;br&gt;+++ compiler/parse_tree.m	2 Dec 2008 05:33:17 -0000
&lt;br&gt;@@ -30,9 +30,11 @@
&lt;br&gt;&amp;nbsp;:- include_module prog_io. 
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_dcg.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_goal.
&lt;br&gt;+ &amp;nbsp; :- include_module prog_io_mode_defn.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_mutable.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_pragma.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_sym_name.
&lt;br&gt;+ &amp;nbsp; :- include_module prog_io_type_defn.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_typeclass.
&lt;br&gt;&amp;nbsp; &amp;nbsp; :- include_module prog_io_util.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Index: compiler/prog_io.m
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /home/mercury/mercury1/repository/mercury/compiler/prog_io.m,v
&lt;br&gt;retrieving revision 1.295
&lt;br&gt;diff -u -b -r1.295 prog_io.m
&lt;br&gt;--- compiler/prog_io.m	2 Dec 2008 04:30:24 -0000	1.295
&lt;br&gt;+++ compiler/prog_io.m	2 Dec 2008 06:47:53 -0000
&lt;br&gt;@@ -32,16 +32,6 @@
&lt;br&gt;&amp;nbsp;% Simplifications are done only by make_hlds.m, which transforms
&lt;br&gt;&amp;nbsp;% the parse tree which we built here into the HLDS.
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;-% Some of this code is a rather bad example of cut-and-paste style reuse.
&lt;br&gt;-% It should be cleaned up to eliminate most of the duplication.
&lt;br&gt;-% But that task really needs to wait until we implement higher-order
&lt;br&gt;-% predicates. &amp;nbsp;For the moment, just be careful that any changes
&lt;br&gt;-% you make are reflected correctly in all similar parts of this file.
&lt;br&gt;-%
&lt;br&gt;-% Implication and equivalence implemented by squirrel, who would also
&lt;br&gt;-% like to get her hands on this file and give it a good clean up and
&lt;br&gt;-% put it into good clean &amp;quot;mercury&amp;quot; style!
&lt;br&gt;-%
&lt;br&gt;&amp;nbsp;% Wishlist:
&lt;br&gt;&amp;nbsp;%
&lt;br&gt;&amp;nbsp;% 1. &amp;nbsp;implement importing/exporting operators with a particular fixity
&lt;br&gt;@@ -162,24 +152,6 @@
&lt;br&gt;&amp;nbsp;:- pred parse_decl(module_name::in, varset::in, term::in, int::in,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_type_defn_head(ModuleName, VarSet, Head, HeadResult):
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Check the head of a type definition for errors.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_type_defn_head(module_name::in, varset::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe2(sym_name, list(type_param))::out) is det.
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_type_decl_where_part_if_present(TypeSymName, Arity,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% &amp;nbsp; IsSolverType, Inst, ModuleName, Term0, Term, Result):
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Checks if Term0 is a term of the form `&amp;lt;body&amp;gt; where &amp;lt;attributes&amp;gt;'.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% If so, returns the `&amp;lt;body&amp;gt;' in Term and the parsed `&amp;lt;attributes&amp;gt;'
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% in Result. If not, returns Term = Term0 and Result = no.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_type_decl_where_part_if_present(is_solver_type::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;module_name::in, varset::in, term::in, term::out,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe2(maybe(solver_type_details), maybe(unify_compare))::out) is det.
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;% Replace all occurrences of inst_var(I) with
&lt;br&gt;@@ -214,9 +186,11 @@
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.mercury_to_mercury.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_dcg.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_goal.
&lt;br&gt;+:- import_module parse_tree.prog_io_mode_defn.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_mutable.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_pragma.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_sym_name.
&lt;br&gt;+:- import_module parse_tree.prog_io_type_defn.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_typeclass.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_io_util.
&lt;br&gt;&amp;nbsp;:- import_module parse_tree.prog_mode.
&lt;br&gt;@@ -1027,23 +1001,6 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;%-----------------------------------------------------------------------------%
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- type decl_attribute
&lt;br&gt;- &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;decl_attr_purity(purity)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; decl_attr_quantifier(quantifier_type, list(var))
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; decl_attr_constraints(quantifier_type, term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the term here is the (not yet parsed) list of constraints
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; decl_attr_solver_type.
&lt;br&gt;-
&lt;br&gt;-:- type quantifier_type
&lt;br&gt;- &amp;nbsp; &amp;nbsp;---&amp;gt; &amp;nbsp; &amp;nbsp;quant_type_exist
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; &amp;nbsp; &amp;nbsp; &amp;nbsp; quant_type_univ.
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The term associated with each decl_attribute is the term containing
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% both the attribute and the declaration that that attribute modifies;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% this term is used when printing out error messages for cases when
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% attributes are used on declarations where they are not allowed.
&lt;br&gt;-:- type decl_attrs == assoc_list(decl_attribute, term.context).
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;parse_decl(ModuleName, VarSet, Term, SeqNum, MaybeItem) :-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;parse_attrs_and_decl(ModuleName, VarSet, Term, [], SeqNum, MaybeItem).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -1384,1401 +1341,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;).
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-:- pred parse_decl_attribute(string::in, list(term)::in, decl_attribute::out,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;term::out) is semidet.
&lt;br&gt;-
&lt;br&gt;-parse_decl_attribute(Functor, ArgTerms, Attribute, SubTerm) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;impure&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [SubTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_purity(purity_impure)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;semipure&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [SubTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_purity(purity_semipure)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;&amp;lt;=&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [SubTerm, ConstraintsTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_constraints(quant_type_univ, ConstraintsTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;=&amp;gt;&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [SubTerm, ConstraintsTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_constraints(quant_type_exist, ConstraintsTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;some&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [TVarsTerm, SubTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_list_of_vars(TVarsTerm, TVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_quantifier(quant_type_exist, TVars)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;all&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [TVarsTerm, SubTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_list_of_vars(TVarsTerm, TVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_quantifier(quant_type_univ, TVars)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Functor = &amp;quot;solver&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [SubTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attribute = decl_attr_solver_type
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred check_no_attributes(maybe1(T)::in, decl_attrs::in, maybe1(T)::out)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;is det.
&lt;br&gt;-
&lt;br&gt;-check_no_attributes(Result0, Attributes, Result) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result0 = ok1(_),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Attributes = [Attr - Context | _]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX Shouldn't we mention EVERY element of Attributes?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error:&amp;quot;), words(attribute_description(Attr)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;not allowed here.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(Context, [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = Result0
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func attribute_description(decl_attribute) = string.
&lt;br&gt;-
&lt;br&gt;-attribute_description(decl_attr_purity(_)) = &amp;quot;purity specifier&amp;quot;.
&lt;br&gt;-attribute_description(decl_attr_quantifier(quant_type_univ, _)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;&amp;quot;universal quantifier (`all')&amp;quot;.
&lt;br&gt;-attribute_description(decl_attr_quantifier(quant_type_exist, _)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;&amp;quot;existential quantifier (`some')&amp;quot;.
&lt;br&gt;-attribute_description(decl_attr_constraints(quant_type_univ, _)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;&amp;quot;type class constraint (`&amp;lt;=')&amp;quot;.
&lt;br&gt;-attribute_description(decl_attr_constraints(quant_type_exist, _)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;&amp;quot;existentially quantified type class constraint (`=&amp;gt;')&amp;quot;.
&lt;br&gt;-attribute_description(decl_attr_solver_type) = &amp;quot;solver type specifier&amp;quot;.
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% Parsing type definitions.
&lt;br&gt;-%
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_type_defn parses the definition of a type.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_type_defn(module_name::in, varset::in, term::in, decl_attrs::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;prog_context::in, int::in, maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_type_defn(ModuleName, VarSet, TypeDefnTerm, Attributes, Context,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefnTerm = term.functor(term.atom(Name), ArgTerms, _),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArgTerms = [HeadTerm, BodyTerm],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Name = &amp;quot;---&amp;gt;&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Name = &amp;quot;==&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Name = &amp;quot;where&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_condition_suffix(BodyTerm, BeforeCondTerm, Condition),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name = &amp;quot;---&amp;gt;&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_du_type_defn(ModuleName, VarSet,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTerm, BeforeCondTerm, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name = &amp;quot;==&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_eqv_type_defn(ModuleName, VarSet,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTerm, BeforeCondTerm, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name = &amp;quot;where&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_solver_type_defn(ModuleName, VarSet,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTerm, BeforeCondTerm, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_abstract_type_defn(ModuleName, VarSet, TypeDefnTerm, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition = cond_true
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% Code dealing with definitions of discriminated union types.
&lt;br&gt;-%
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_du_type_defn parses the definition of a discriminated union type.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_du_type_defn(module_name::in, varset::in, term::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;decl_attrs::in, condition::in, prog_context::in, int::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_du_type_defn(ModuleName, VarSet, HeadTerm, BodyTerm, Attributes0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;get_is_solver_type(IsSolverType, Attributes0, Attributes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: a solver type&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;cannot have data constructors.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(HeadTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = non_solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_type_defn_head(ModuleName, VarSet, HeadTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;du_type_rhs_ctors_and_where_terms(BodyTerm, CtorsTerm, MaybeWhereTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCtors = parse_constructors(ModuleName, VarSet, CtorsTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhere = parse_type_decl_where_term(non_solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ModuleName, VarSet, MaybeWhereTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% The code to process `where' attributes will return an error
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% if solver attributes are given for a non-solver type. Because
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% this is a du type, if the unification with MaybeWhere succeeds
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% then _NoSolverTypeDetails is guaranteed to be `no'.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs = ok2(Name, Params),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCtors = ok1(Ctors),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhere = ok2(_NoSolverTypeDetails, MaybeUserEqComp)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;process_du_ctors(Params, VarSet, BodyTerm, Ctors, [], CtorsSpecs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorsSpecs = [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, TypeVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn = parse_tree_du_type(Ctors, MaybeUserEqComp),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ItemTypeDefn = item_type_defn_info(TypeVarSet, Name, Params,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn, Condition, Context, SeqNum),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item = item_type_defn(ItemTypeDefn),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem0 = ok1(Item),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_no_attributes(MaybeItem0, Attributes, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorsSpecs = [_ | _],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(CtorsSpecs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Specs = get_any_errors2(MaybeTypeCtorAndArgs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeCtors) ++ get_any_errors2(MaybeWhere),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred du_type_rhs_ctors_and_where_terms(term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;term::out, maybe(term)::out) is det.
&lt;br&gt;-
&lt;br&gt;-du_type_rhs_ctors_and_where_terms(Term, CtorsTerm, MaybeWhereTerm) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = term.functor(term.atom(&amp;quot;where&amp;quot;), Args, _Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Args = [CtorsTerm0, WhereTerm]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorsTerm &amp;nbsp; &amp;nbsp; &amp;nbsp;= CtorsTerm0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereTerm = yes(WhereTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorsTerm &amp;nbsp; &amp;nbsp; &amp;nbsp;= Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereTerm = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Convert a list of terms separated by semi-colons (known as a
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% &amp;quot;disjunction&amp;quot;, even thought the terms aren't goals in this case)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% into a list of constructors.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- func parse_constructors(module_name, varset, term) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(list(constructor)).
&lt;br&gt;-
&lt;br&gt;-parse_constructors(ModuleName, VarSet, Term) = MaybeConstructors :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;disjunction_to_list(Term, BodyTermList),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;MaybeConstructors = parse_constructors_2(ModuleName, VarSet, BodyTermList).
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% True if the term is a valid list of constructors.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- func parse_constructors_2(module_name, varset, list(term)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(list(constructor)).
&lt;br&gt;-
&lt;br&gt;-parse_constructors_2(_ModuleName, _, []) = ok1([]).
&lt;br&gt;-parse_constructors_2(ModuleName, VarSet, [Head | Tail]) = MaybeConstructors :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;MaybeHeadConstructor = parse_constructor(ModuleName, VarSet, Head),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;MaybeTailConstructors = parse_constructors_2(ModuleName, VarSet, Tail),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeHeadConstructor = ok1(HeadConstructor),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailConstructors = ok1(TailConstructors)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Constructors = [HeadConstructor | TailConstructors],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructors = ok1(Constructors)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Specs = get_any_errors1(MaybeHeadConstructor) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeTailConstructors),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructors = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_constructor(module_name, varset, term) = maybe1(constructor).
&lt;br&gt;-
&lt;br&gt;-parse_constructor(ModuleName, VarSet, Term) = MaybeConstructor :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( Term = term.functor(term.atom(&amp;quot;some&amp;quot;), [VarsTerm, SubTerm], _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( parse_list_of_vars(VarsTerm, ExistQVars) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.map(term.coerce_var, ExistQVars, ExistQTVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = parse_constructor_2(ModuleName, VarSet,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExistQTVars, Term, SubTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TermStr = describe_error_term(VarSet, Term),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: syntax error in variable list at&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(TermStr), suffix(&amp;quot;.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(VarsTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExistQVars = [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = parse_constructor_2(ModuleName, VarSet, ExistQVars,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term, Term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_constructor_2(module_name, varset, list(tvar), term, term) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(constructor).
&lt;br&gt;-
&lt;br&gt;-parse_constructor_2(ModuleName, VarSet, ExistQVars, ContainingTerm, Term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= MaybeConstructor :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;get_existential_constraints_from_term(ModuleName, VarSet, Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BeforeConstraintsTerm, MaybeConstraints),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstraints = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstraints = ok1(Constraints),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Note that as a special case, one level of curly braces around
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the constructor are ignored. This is to allow you to define
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% ';'/2 and 'some'/2 constructors.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BeforeConstraintsTerm = term.functor(term.atom(&amp;quot;{}&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[InsideBracesTerm], _Context)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MainTerm = InsideBracesTerm
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MainTerm = BeforeConstraintsTerm
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ContextPieces = [words(&amp;quot;In constructor definition:&amp;quot;)],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_implicitly_qualified_term(ModuleName, MainTerm, ContainingTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, ContextPieces, MaybeFunctorAndArgTerms),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeFunctorAndArgTerms = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor &amp;nbsp;= error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeFunctorAndArgTerms = ok2(Functor, ArgTerms),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = convert_constructor_arg_list(ModuleName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, ArgTerms),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = ok1(ConstructorArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Ctor = ctor(ExistQVars, Constraints, Functor, ConstructorArgs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_term_context(MainTerm)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructor = ok1(Ctor)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred get_existential_constraints_from_term(module_name::in, varset::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;term::in, term::out, maybe1(list(prog_constraint))::out) is det.
&lt;br&gt;-
&lt;br&gt;-get_existential_constraints_from_term(ModuleName, VarSet, !PredTypeTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeExistentialConstraints) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!.PredTypeTerm = term.functor(term.atom(&amp;quot;=&amp;gt;&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[!:PredTypeTerm, ExistentialConstraints], _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_class_constraints(ModuleName, VarSet, ExistentialConstraints,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeExistentialConstraints)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeExistentialConstraints = ok1([])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func convert_constructor_arg_list(module_name, varset, list(term)) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(list(constructor_arg)).
&lt;br&gt;-
&lt;br&gt;-convert_constructor_arg_list(_, _, []) = ok1([]).
&lt;br&gt;-convert_constructor_arg_list(ModuleName, VarSet, [Term | Terms])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= MaybeConstructorArgs :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( Term = term.functor(term.atom(&amp;quot;::&amp;quot;), [NameTerm, TypeTerm], _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ContextPieces = [words(&amp;quot;In field name:&amp;quot;)],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_implicitly_qualified_term(ModuleName, NameTerm, Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, ContextPieces, MaybeSymNameAndArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSymNameAndArgs = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSymNameAndArgs = ok2(SymName, SymNameArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SymNameArgs = [_ | _],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX Should we add &amp;quot;... at function symbol ...&amp;quot;?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: syntax error in constructor name.&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SymNameArgs = [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeFieldName = yes(SymName),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;convert_constructor_arg_list_2(ModuleName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, MaybeFieldName, TypeTerm, Terms)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeFieldName = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeTerm = Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeConstructorArgs = convert_constructor_arg_list_2(ModuleName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, MaybeFieldName, TypeTerm, Terms)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func convert_constructor_arg_list_2(module_name, varset, maybe(sym_name),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;term, list(term)) = maybe1(list(constructor_arg)).
&lt;br&gt;-
&lt;br&gt;-convert_constructor_arg_list_2(ModuleName, VarSet, MaybeFieldName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeTerm, Terms) = MaybeArgs :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ContextPieces = [words(&amp;quot;In type definition:&amp;quot;)],
&lt;br&gt;- &amp;nbsp; &amp;nbsp;parse_type(TypeTerm, VarSet, ContextPieces, MaybeType),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeType = ok1(Type),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Context = get_term_context(TypeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Arg = ctor_arg(MaybeFieldName, Type, Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailArgs =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;convert_constructor_arg_list(ModuleName, VarSet, Terms),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailArgs = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeArgs &amp;nbsp;= error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailArgs = ok1(Args),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeArgs &amp;nbsp;= ok1([Arg | Args])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeType = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeArgs = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred process_du_ctors(list(type_param)::in, varset::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;list(constructor)::in, list(error_spec)::in, list(error_spec)::out) is det.
&lt;br&gt;-
&lt;br&gt;-process_du_ctors(_Params, _, _, [], !Specs).
&lt;br&gt;-process_du_ctors(Params, VarSet, BodyTerm, [Ctor | Ctors], !Specs) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Ctor = ctor(ExistQVars, Constraints, _CtorName, CtorArgs, _Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all type variables in the ctor are either explicitly
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% existentially quantified or occur in the head of the type.
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorArgTypes = list.map(func(C) = C ^ arg_type, CtorArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type_vars_list(CtorArgTypes, VarsInCtorArgTypes0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.sort_and_remove_dups(VarsInCtorArgTypes0, VarsInCtorArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.filter(list.contains(ExistQVars ++ Params), VarsInCtorArgTypes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_ExistQOrParamVars, NotExistQOrParamVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotExistQOrParamVars = [_ | _]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% There should be no duplicate names to remove.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, GenericVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotExistQOrParamVarsStr =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mercury_vars_to_string(GenericVarSet, no, NotExistQOrParamVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: free type&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(NotExistQOrParamVars,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;parameter&amp;quot;, &amp;quot;parameters&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(NotExistQOrParamVarsStr),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in RHS of type definition.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(BodyTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:Specs = [Spec | !.Specs]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all type variables in existential quantifiers do not
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% occur in the head (maybe this should just be a warning, not an error?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% If we were to allow it, we would need to rename them apart.)
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.list_to_set(ExistQVars, ExistQVarsSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.list_to_set(Params, ParamsSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.intersect(ExistQVarsSet, ParamsSet, ExistQParamsSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.non_empty(ExistQParamsSet)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% There should be no duplicate names to remove.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set.to_sorted_list(ExistQParamsSet, ExistQParams),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, GenericVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExistQParamVarsStr =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mercury_vars_to_string(GenericVarSet, no, ExistQParams),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(ExistQParams,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;type variable&amp;quot;, &amp;quot;type variables&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(ExistQParamVarsStr),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(ExistQParams, &amp;quot;has&amp;quot;, &amp;quot;have&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;overlapping scopes&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;(explicit type quantifier shadows argument type).&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(BodyTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:Specs = [Spec | !.Specs]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all type variables in existential quantifiers occur
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% somewhere in the constructor argument types or constraints.
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CtorArgTypes = list.map(func(C) = C ^ arg_type, CtorArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type_vars_list(CtorArgTypes, VarsInCtorArgTypes0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.sort_and_remove_dups(VarsInCtorArgTypes0, VarsInCtorArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;constraint_list_get_tvars(Constraints, ConstraintTVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.filter(list.contains(VarsInCtorArgTypes ++ ConstraintTVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExistQVars, _OccursExistQVars, NotOccursExistQVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotOccursExistQVars = [_ | _]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% There should be no duplicate names to remove.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, GenericVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotOccursExistQVarsStr =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mercury_vars_to_string(GenericVarSet, no, NotOccursExistQVars),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(NotOccursExistQVars,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;type variable&amp;quot;, &amp;quot;type variables&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(NotOccursExistQVarsStr),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in existential quantifier&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(NotOccursExistQVars,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;does not occur&amp;quot;, &amp;quot;do not occur&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in arguments or constraints of constructor.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(BodyTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:Specs = [Spec | !.Specs]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all type variables in existential constraints occur in
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the existential quantifiers.
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConstraintArgTypeLists =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.map(prog_constraint_get_arg_types, Constraints),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.condense(ConstraintArgTypeLists, ConstraintArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type_vars_list(ConstraintArgTypes, VarsInCtorArgTypes0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.sort_and_remove_dups(VarsInCtorArgTypes0, VarsInCtorArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.filter(list.contains(ExistQVars), VarsInCtorArgTypes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_ExistQArgTypes, NotExistQArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotExistQArgTypes = [_ | _]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, GenericVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NotExistQArgTypesStr =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mercury_vars_to_string(GenericVarSet, no, NotExistQArgTypes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(NotExistQArgTypes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;type variable&amp;quot;, &amp;quot;type variables&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(NotExistQArgTypesStr),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in class constraints,&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(choose_number(NotExistQArgTypes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;which was&amp;quot;, &amp;quot;which were&amp;quot;)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;introduced with&amp;quot;), quote(&amp;quot;=&amp;gt;&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;must be explicitly existentially quantified&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;using&amp;quot;), quote(&amp;quot;some&amp;quot;), suffix(&amp;quot;.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(BodyTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:Specs = [Spec | !.Specs]
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true
&lt;br&gt;- &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;process_du_ctors(Params, VarSet, BodyTerm, Ctors, !Specs).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_eqv_type_defn parses the definition of an equivalence type.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_eqv_type_defn(module_name::in, varset::in, term::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;decl_attrs::in, condition::in, prog_context::in, int::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_eqv_type_defn(ModuleName, VarSet, HeadTerm, BodyTerm, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;parse_type_defn_head(ModuleName, VarSet, HeadTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeNameAndParams),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeNameAndParams = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeNameAndParams = ok2(Name, Params),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all the variables in the body occur in the head.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;term.contains_var(BodyTerm, Var),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;term.coerce_var(Var, TVar),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;not list.member(TVar, Params)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BodyTermStr = describe_error_term(VarSet, BodyTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: free type parameter&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in RHS of type definition:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(BodyTermStr), suffix(&amp;quot;.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(BodyTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% XXX Should pass more correct ContextPieces.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ContextPieces = [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_type(BodyTerm, VarSet, ContextPieces, MaybeType),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeType = ok1(Type),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, TypeVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn = parse_tree_eqv_type(Type),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ItemTypeDefn = item_type_defn_info(TypeVarSet, Name, Params,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn, Condition, Context, SeqNum),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item = item_type_defn(ItemTypeDefn),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem0 = ok1(Item),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_no_attributes(MaybeItem0, Attributes, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeType = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_solver_type_defn parses the definition of a solver type.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_solver_type_defn(module_name::in, varset::in, term::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;decl_attrs::in, condition::in, prog_context::in, int::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_solver_type_defn(ModuleName, VarSet, HeadTerm, BodyTerm, Attributes0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;get_is_solver_type(IsSolverType, Attributes0, Attributes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = non_solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: only solver types can be defined&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;by a `where' block alone.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(HeadTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhere = parse_type_decl_where_term(solver_type, ModuleName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, yes(BodyTerm)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhere = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhere = ok2(MaybeSolverTypeDetails, MaybeUserEqComp),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_solver_type_base(ModuleName, VarSet, HeadTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverTypeDetails, MaybeUserEqComp, Attributes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred parse_solver_type_base(module_name::in, varset::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe(solver_type_details)::in, maybe(unify_compare)::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;decl_attrs::in, condition::in, prog_context::in, int::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_solver_type_base(ModuleName, VarSet, HeadTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverTypeDetails, MaybeUserEqComp, Attributes, Condition,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Context, SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverTypeDetails = yes(SolverTypeDetails),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_type_defn_head(ModuleName, VarSet, HeadTerm, MaybeNameParams),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeNameParams = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeNameParams = ok2(Name, Params),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepnType = SolverTypeDetails ^ representation_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type_contains_var(RepnType, Var),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;not list.member(Var, Params)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTermStr = describe_error_term(VarSet, HeadTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: free type variable&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in representation type:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(HeadTermStr), suffix(&amp;quot;.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(HeadTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, TypeVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn = parse_tree_solver_type(SolverTypeDetails,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeUserEqComp),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ItemTypeDefn = item_type_defn_info(TypeVarSet, Name, Params,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn, Condition, Context, SeqNum),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item = item_type_defn(ItemTypeDefn),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem0 = ok1(Item),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_no_attributes(MaybeItem0, Attributes, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverTypeDetails = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Solver type with no solver_type_details.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(HeadTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% Parse an abstract type definition.
&lt;br&gt;-%
&lt;br&gt;-
&lt;br&gt;-:- pred parse_abstract_type_defn(module_name::in, varset::in, term::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;decl_attrs::in, condition::in, prog_context::in, int::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(item)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_abstract_type_defn(ModuleName, VarSet, HeadTerm, Attributes0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;parse_type_defn_head(ModuleName, VarSet, HeadTerm, MaybeTypeCtorAndArgs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;get_is_solver_type(IsSolverType, Attributes0, Attributes),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs = ok2(Name, Params),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.coerce(VarSet, TypeVarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeDefn = parse_tree_abstract_type(IsSolverType),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ItemTypeDefn = item_type_defn_info(TypeVarSet, Name, Params, TypeDefn,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Condition, Context, SeqNum),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item = item_type_defn(ItemTypeDefn),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem0 = ok1(Item),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_no_attributes(MaybeItem0, Attributes, MaybeItem)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% Parse ... where ... clauses in type definitions. These clauses can specify
&lt;br&gt;-% type-specific unify and/or compare predicates for discriminated union types
&lt;br&gt;-% and solver type details for solver types.
&lt;br&gt;-%
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The optional `where ...' part of the type definition syntax
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% is a comma separated list of special type `attributes'.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The possible attributes (in this order) are either
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `type_is_abstract_noncanonical' on its own appears only in .int2
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% &amp;nbsp; files and indicates that the type has user-defined equality and/or
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% &amp;nbsp; comparison, but that what these predicates are is not known at
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% &amp;nbsp; this point
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% or
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `representation is &amp;lt;&amp;lt;type name&amp;gt;&amp;gt;' (required for solver types)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `initialisation is &amp;lt;&amp;lt;pred name&amp;gt;&amp;gt;' (required for solver types)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `ground is &amp;lt;&amp;lt;inst&amp;gt;&amp;gt;' (required for solver types)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `any is &amp;lt;&amp;lt;inst&amp;gt;&amp;gt;' (required for solver types)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `equality is &amp;lt;&amp;lt;pred name&amp;gt;&amp;gt;' (optional)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - `comparison is &amp;lt;&amp;lt;pred name&amp;gt;&amp;gt;' (optional).
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-parse_type_decl_where_part_if_present(IsSolverType, ModuleName, VarSet,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term, BeforeWhereTerm, MaybeWhereDetails) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = term.functor(term.atom(&amp;quot;where&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[BeforeWhereTermPrime, WhereTerm], _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BeforeWhereTerm = BeforeWhereTermPrime,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereDetails = parse_type_decl_where_term(IsSolverType,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ModuleName, VarSet, yes(WhereTerm))
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BeforeWhereTerm = Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereDetails = ok2(no, no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% The maybe2 wrapper allows us to return an error code or a pair
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% of results. Either result half may be empty, hence the maybe
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% wrapper around each of those.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- func parse_type_decl_where_term(is_solver_type, module_name, varset,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe(term)) = maybe2(maybe(solver_type_details), maybe(unify_compare)).
&lt;br&gt;-
&lt;br&gt;-parse_type_decl_where_term(IsSolverType, ModuleName, VarSet, MaybeTerm0) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereDetails :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTerm0 = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereDetails = ok2(no, no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTerm0 = yes(Term0),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;some [!MaybeTerm] (
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!:MaybeTerm = MaybeTerm0,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_type_is_abstract_noncanonical,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeIsAbstractNoncanonical, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;representation&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_type_is(ModuleName, VarSet)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeRepresentationIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_initialisation_is(ModuleName,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInitialisationIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;ground&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_inst_is(ModuleName)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;any&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_inst_is(ModuleName)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeAnyIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;constraint_store&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_mutable_is(ModuleName)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCStoreIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;equality&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_pred_is(ModuleName, VarSet)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqualityIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_attribute(parse_where_is(&amp;quot;comparison&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_pred_is(ModuleName, VarSet)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeComparisonIs, !MaybeTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_end(!.MaybeTerm, MaybeWhereEnd)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereDetails = make_maybe_where_details(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeIsAbstractNoncanonical,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeRepresentationIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInitialisationIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeAnyIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCStoreIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqualityIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeComparisonIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereEnd,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term0
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% parse_where_attribute(Parser, Result, MaybeTerm, MaybeTailTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% handles
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - where MaybeTerm may contain nothing
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - where MaybeTerm may be a comma-separated pair
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - applies Parser to the appropriate (sub)term to obtain Result
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% - sets MaybeTailTerm depending upon whether the Result is an error
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% or not and whether there is more to parse because MaybeTerm
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% was a comma-separated pair.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- pred parse_where_attribute((func(term) = maybe1(maybe(T)))::in,
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(T))::out, maybe(term)::in, maybe(term)::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_where_attribute(Parser, Result, MaybeTerm, MaybeTailTerm) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTerm = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTerm = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = ok1(no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTerm = yes(Term),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = term.functor(term.atom(&amp;quot;,&amp;quot;), [HeadTerm, TailTerm], _)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = Parser(HeadTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTermIfYes = yes(TailTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = Parser(Term),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTermIfYes = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = error1(_),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTerm = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = ok1(no),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTerm = yes(Term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = ok1(yes(_)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTailTerm = MaybeTailTermIfYes
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% Parser for `where ...' attributes of the form
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% `attributename is attributevalue'.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;%
&lt;br&gt;-:- func parse_where_is(string, func(term) = maybe1(T), term) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(T)).
&lt;br&gt;-
&lt;br&gt;-parse_where_is(Name, Parser, Term) = Result :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( Term = term.functor(term.atom(&amp;quot;is&amp;quot;), [LHS, RHS], _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( LHS = term.functor(term.atom(Name), [], _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHSResult = Parser(RHS),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHSResult = ok1(ParsedRHS),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result &amp;nbsp; &amp;nbsp;= ok1(yes(ParsedRHS))
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RHSResult = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result &amp;nbsp; &amp;nbsp;= error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = ok1(no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: expected&amp;quot;), quote(&amp;quot;is&amp;quot;), suffix(&amp;quot;.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_type_is_abstract_noncanonical(term) = maybe1(maybe(unit)).
&lt;br&gt;-
&lt;br&gt;-parse_where_type_is_abstract_noncanonical(Term) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( Term = term.functor(term.atom(&amp;quot;type_is_abstract_noncanonical&amp;quot;), [], _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ok1(yes(unit))
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ok1(no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_initialisation_is(module_name, varset, term) =
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(sym_name)).
&lt;br&gt;-
&lt;br&gt;-parse_where_initialisation_is(ModuleName, VarSet, Term) = Result :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Result0 = parse_where_is(&amp;quot;initialisation&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_pred_is(ModuleName, VarSet), Term),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result0 = ok1(no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result1 = parse_where_is(&amp;quot;initialization&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_where_pred_is(ModuleName, VarSet), Term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result1 = Result0
&lt;br&gt;- &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;promise_pure (
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result1 = ok1(yes(_)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;semipure
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;semipure_get_solver_auto_init_supported(AutoInitSupported),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AutoInitSupported = yes,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = Result1
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AutoInitSupported = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: unknown attribute&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;in solver type definition.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( Result1 = ok1(no)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Result1 = error1(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Result = Result1
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_pred_is(module_name, varset, term) = maybe1(sym_name).
&lt;br&gt;-
&lt;br&gt;-parse_where_pred_is(ModuleName, VarSet, Term) = MaybeSymName :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;parse_implicitly_qualified_symbol_name(ModuleName, VarSet, Term,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSymName).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_inst_is(module_name, term) = maybe1(mer_inst).
&lt;br&gt;-
&lt;br&gt;-parse_where_inst_is(_ModuleName, Term) = MaybeInst :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;convert_inst(no_allow_constrained_inst_var, Term, Inst),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;not inst_contains_unconstrained_var(Inst)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInst = ok1(Inst)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: expected a ground, unconstrained inst.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInst = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_type_is(module_name, varset, term) = maybe1(mer_type).
&lt;br&gt;-
&lt;br&gt;-parse_where_type_is(_ModuleName, VarSet, Term) = MaybeType :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;% XXX We should pass meaningful ContextPieces.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ContextPieces = [],
&lt;br&gt;- &amp;nbsp; &amp;nbsp;parse_type(Term, VarSet, ContextPieces, MaybeType).
&lt;br&gt;-
&lt;br&gt;-:- func parse_where_mutable_is(module_name, term) = maybe1(list(item)).
&lt;br&gt;-
&lt;br&gt;-parse_where_mutable_is(ModuleName, Term) = MaybeItems :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;( Term = term.functor(term.atom(&amp;quot;mutable&amp;quot;), _, _) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_mutable_decl_term(ModuleName, Term, MaybeItem),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = ok1(Mutable),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItems &amp;nbsp;= ok1([Mutable])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItems &amp;nbsp;= error1(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;; list_term_to_term_list(Term, Terms) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_parser(parse_mutable_decl_term(ModuleName), Terms, MaybeItems)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: expected a mutable declaration&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;or a list of mutable declarations.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItems = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred parse_mutable_decl_term(module_name::in, term::in, maybe1(item)::out)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;is det.
&lt;br&gt;-
&lt;br&gt;-parse_mutable_decl_term(ModuleName, Term, MaybeItem) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Term = term.functor(term.atom(&amp;quot;mutable&amp;quot;), Args, Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;varset.init(VarSet),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_mutable_decl(ModuleName, VarSet, Args, Context, -1,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItemPrime)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = MaybeItemPrime
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: expected a mutable declaration.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeItem = error1([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- pred parse_where_end(maybe(term)::in, maybe1(maybe(unit))::out) is det.
&lt;br&gt;-
&lt;br&gt;-parse_where_end(no, ok1(yes(unit))).
&lt;br&gt;-parse_where_end(yes(Term), error1([Spec])) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: attributes are either badly ordered&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;or contain an unrecognised attribute.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(Term), [always(Pieces)])]).
&lt;br&gt;-
&lt;br&gt;-:- func make_maybe_where_details(is_solver_type, maybe1(maybe(unit)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(mer_type)), maybe1(maybe(init_pred)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(mer_inst)), maybe1(maybe(mer_inst)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(list(item))),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(equality_pred)), maybe1(maybe(comparison_pred)),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe1(maybe(unit)), term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;= maybe2(maybe(solver_type_details), maybe(unify_compare)).
&lt;br&gt;-
&lt;br&gt;-make_maybe_where_details(IsSolverType, MaybeTypeIsAbstractNoncanonical,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeRepresentationIs, MaybeInitialisationIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundIs, MaybeAnyIs, MaybeCStoreIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqualityIs, MaybeComparisonIs, MaybeWhereEnd, WhereTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= MaybeSolverUC :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeIsAbstractNoncanonical = ok1(TypeIsAbstractNoncanonical),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeRepresentationIs = ok1(RepresentationIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInitialisationIs = ok1(InitialisationIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundIs = ok1(GroundIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeAnyIs = ok1(AnyIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCStoreIs = ok1(CStoreIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqualityIs = ok1(EqualityIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeComparisonIs = ok1(ComparisonIs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeWhereEnd = ok1(WhereEnd)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = make_maybe_where_details_2(IsSolverType,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeIsAbstractNoncanonical, RepresentationIs, InitialisationIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GroundIs, AnyIs, CStoreIs, EqualityIs, ComparisonIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WhereEnd, WhereTerm)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Specs =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeTypeIsAbstractNoncanonical) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeRepresentationIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeInitialisationIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeGroundIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeAnyIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeCStoreIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeEqualityIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeComparisonIs) ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get_any_errors1(MaybeWhereEnd),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = error2(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-:- func make_maybe_where_details_2(is_solver_type, maybe(unit),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe(mer_type), maybe(init_pred), maybe(mer_inst), maybe(mer_inst),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe(list(item)), maybe(equality_pred), maybe(comparison_pred),
&lt;br&gt;- &amp;nbsp; &amp;nbsp;maybe(unit), term)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;= maybe2(maybe(solver_type_details), maybe(unify_compare)).
&lt;br&gt;-
&lt;br&gt;-make_maybe_where_details_2(IsSolverType, TypeIsAbstractNoncanonical,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepresentationIs, InitialisationIs, GroundIs, AnyIs, CStoreIs,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EqualityIs, ComparisonIs, _WhereEnd, WhereTerm) = MaybeSolverUC :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeIsAbstractNoncanonical = yes(_),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% rafe: XXX I think this is wrong. There isn't a problem with having
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% the solver_type_details and type_is_abstract_noncanonical.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepresentationIs = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InitialisationIs = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GroundIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AnyIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EqualityIs &amp;nbsp; &amp;nbsp; &amp;nbsp; = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ComparisonIs &amp;nbsp; &amp;nbsp; = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CStoreIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = maybe.no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ok2(no, yes(abstract_noncanonical_type(IsSolverType)))
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error:&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quote(&amp;quot;where type_is_abstract_noncanonical&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;excludes other&amp;quot;), quote(&amp;quot;where ...&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;attributes.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(WhereTerm), [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = error2([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TypeIsAbstractNoncanonical = maybe.no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepresentationIs = yes(RepnType),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InitialisationIs = MaybeInitialisation,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GroundIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = MaybeGroundInst,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AnyIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= MaybeAnyInst,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EqualityIs &amp;nbsp; &amp;nbsp; &amp;nbsp; = MaybeEqPred,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ComparisonIs &amp;nbsp; &amp;nbsp; = MaybeCmpPred,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CStoreIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = MaybeMutableItems
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundInst = yes(GroundInst)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeGroundInst = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GroundInst = ground_inst
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeAnyInst = yes(AnyInst)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeAnyInst = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AnyInst = ground_inst
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeMutableItems = yes(MutableItems)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeMutableItems = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MutableItems = []
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInitialisation = yes(InitPred),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HowToInit = solver_init_automatic(InitPred)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeInitialisation = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HowToInit = solver_init_explicit
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SolverTypeDetails = solver_type_details(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepnType, HowToInit, GroundInst, AnyInst, MutableItems),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverTypeDetails = yes(SolverTypeDetails),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqPred = no,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeCmpPred = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeUnifyCompare = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeUnifyCompare = yes(unify_compare(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeEqPred, MaybeCmpPred))
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = ok2(MaybeSolverTypeDetails, MaybeUnifyCompare)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RepresentationIs = no
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: solver type definitions must have a&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quote(&amp;quot;representation&amp;quot;), words(&amp;quot;attribute.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(WhereTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = error2([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unexpected(this_file, &amp;quot;make_maybe_where_details_2: &amp;quot; ++
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;shouldn't have reached this point! (1)&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IsSolverType = non_solver_type,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( RepresentationIs = yes(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; InitialisationIs = yes(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; GroundIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = yes(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; AnyIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= yes(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; CStoreIs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = yes(_)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: solver type attribute given&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words(&amp;quot;for non-solver type.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(get_term_context(WhereTerm),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC = error2([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EqualityIs = MaybeEqPred,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ComparisonIs = MaybeCmpPred,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeSolverUC =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ok2(no, yes(unify_compare(MaybeEqPred, MaybeCmpPred)))
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;).
&lt;br&gt;-
&lt;br&gt;-%-----------------------------------------------------------------------------%
&lt;br&gt;-%
&lt;br&gt;-% Predicates useful for parsing several kinds of type definitions.
&lt;br&gt;-%
&lt;br&gt;-
&lt;br&gt;-parse_type_defn_head(ModuleName, VarSet, HeadTerm, MaybeTypeCtorAndArgs) :-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTerm = term.variable(_, Context),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pieces = [words(&amp;quot;Error: variable on LHS of type definition.&amp;quot;), nl],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Spec = error_spec(severity_error, phase_term_to_parse_tree,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[simple_msg(Context, [always(Pieces)])]),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs = error2([Spec])
&lt;br&gt;- &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadTerm = term.functor(_, _, HeadContext),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ContextPieces = [words(&amp;quot;In type definition:&amp;quot;)],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;parse_implicitly_qualified_term(ModuleName, HeadTerm, HeadTerm,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VarSet, ContextPieces, HeadResult),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadResult = error2(Specs),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MaybeTypeCtorAndArgs = error2(Specs)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeadResult = ok2(Name, ArgTerms),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all the head args are variables.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( term_list_to_var_list(ArgTerms, Params0) -&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;% Check that all the head arg variables are distinct.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;n