[net.lang.prolog] CProlog Bug

Tombl@Berkeley@OgcVax.UUCP (07/11/83)

There is a bug in the CProlog grammar rules. Translation of
expressions of the following form may be affected:

        (expr1 ; expr2)

The current rules produce code which may incorrectly bind the return 
que for some instances of user code. For example, the expression

        ( funct(arg1,...,argn) ; {expr1} )

is translated to produce

        funct(arg1,...,argn,Input,Output)

for the left member, which is correct. Translation of the right member
returns expr1, also correct, but has the side effect of binding its 
input que to its output que. These happen also to be the input and 
output ques for the expression as a whole, so the left member 
translation effectively becomes

        funct(arg1,...,argn,Input,Input)

which is incorrect.

The bug fix is straightforward, and should be applied to 
prolog/pl/grammar:

30,32c30,32 < $t_rp((T;R),S,SR,(Tt;Rt)) :- !, /* distributed code */ <
$t_rp(T,S,SR,Tt), < $t_rp(R,S,SR,Rt).
--- > $t_rp((T;R),S,SR,(Tt,SR=SR1;Rt,SR=SR2)) :- !, /* modified code
*/ > $t_rp(T,S,SR1,Tt), > $t_rp(R,S,SR2,Rt).

I'd be interested in seeing a better solution, if someone should come
up with one.

-- Tom Blenko
   decvax!tektronix!ogcvax!metheus!tombl
   ucbvax!tektronix!ogcvax!metheus!tombl