[mercury-users] Switches and Determinism

Jonathan Morgan jonmmorgan at gmail.com
Mon Sep 11 13:55:11 AEST 2006


If I have a type like the following type:

:- type switch_test --->
	type1;
	type2;
	type3.

Then the following code looks fairly deterministic to me.

:- func test(switch_test) = int.
test(S) = Y :-
	(
		S = type1,
		Y = 1
	;
		(S = type2
		; S = type3),
		Y = 2
	).

However, the compiler tells me that this is non-deterministic.  Surely
things like this are wanted in other places?  How can you make it so
that a switch has one clause for multiple types being switched on?

switch_test.m:015: In `test(in) = out':
switch_test.m:015:   error: determinism declaration not satisfied.
switch_test.m:015:   Declared `det', inferred `nondet'.
switch_test.m:018:   Unification of `S' and `switch_test.type1' can fail.
switch_test.m:022: The switch on S does not cover switch_test.type1/0.
switch_test.m:018:   Disjunction has multiple clauses with solutions.
switch_test.m:015: Error: invalid determinism for `test(in) = out':
switch_test.m:015:   the primary mode of a function cannot be `nondet'.
For more information, try recompiling with `-E'.

Jon
--------------------------------------------------------------------------
mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the users mailing list