<div dir="ltr">>
To paraphrase Neo, "I know Prolog".<br>
<br><div>> but I don't know Mercury and I am struggling to figure out this error....I</div><div>> am porting some old SWI code and it boils down to the fact that I obvuisly</div>
>
don't truly understand what "det" means! Here is the code both as discrete<br>
>
disjunctive clauses and a single big disjunct:<br>
>
<br>
>
:- pred char_type(char::in, chartype::out) is det.<br>
>
<br>
>
char_type(')', p_open).<br>
>
char_type('(', p_close).<br>
>
char_type(_, c_general).<br>
>
<br>
>
char_type(C, T) :-<br>>
(<br>
>
C = '(', T = p_open<br>
>
; C = ')', T = p_close<br>
>
; C = _, T = c_general<br><div>
>
). <br></div><br><div>What you probably want is to use if/then/conditionals instead of a disjunction. When Mercury sees the C = _, you're telling it that literally all characters should yield c_general, including the characters '(' and ')'. That means that for the inputs of ( and ), there are two solutions. Both the p_* solution, and c_general.<br></div><div><br></div><div>If you also have those rules above, then you're also doubling the solutions (which you won't want to do in most situations).</div></div>