[mercury-users] newbie question on negation

Prashanth prash.n.rao at gmail.com
Tue Sep 18 01:10:13 AEST 2012


Hi Richard,
I added the two predicates, accordingly. However, I get compilation errors.
Here is the updated code
%%%%%% START %%%%%
:- module kb0.

:- interface.

:- import_module io.

:- pred main(io, io).
:- mode main(di, uo) is det.

:- implementation.
:- import_module solutions.

:- type entity == string.
:- func j = entity.
    j = "joe".
:- func m = entity.
    m = "moe".
:- func l = entity.
    l = "larry".

:- pred happy(entity).
:- mode happy(out) is multi.
happy(E) :-
     E = j;
     E = l.

:- pred isentity(entity).
:- mode isentity(in) is semidet.
isentity(E) :-
     E=j; E=m; E=l.

:- pred unhappy(entity).
:- mode unhappy(out) is multi.
unhappy(E) :-
     isentity(E),      % line 35
     not happy(E).  % line 36

main(!IO) :-
     solutions(unhappy, Xs),
     io.write_list(Xs, "\n",  io.write_string, !IO),
     io.nl(!IO).
%%%%%% STOP %%%%%

and the error messages:
kb0.m:036: In clause for `unhappy(out)':
kb0.m:036:   mode error in conjunction. The next 2 error messages indicate
kb0.m:036:   possible causes of this error.
kb0.m:035:   In clause for `unhappy(out)':
kb0.m:035:   in argument 1 of call to predicate `kb0.isentity'/1:
kb0.m:035:   mode error: variable `E' has instantiatedness `free',
kb0.m:035:   expected instantiatedness was `ground'.
kb0.m:036:   In clause for `unhappy(out)':
kb0.m:036:   in argument 1 of call to predicate `kb0.happy'/1:
kb0.m:036:   scope error: attempt to bind a non-local variable inside a
kb0.m:036:   negation.
kb0.m:036:   Variable `E' has instantiatedness `free',
kb0.m:036:   expected instantiatedness was `ground'.
kb0.m:036:   A negation is only allowed to bind variables which are local to
kb0.m:036:   the negation, i.e. those which are implicitly existentially
kb0.m:036:   quantified inside the scope of the negation.

(Sorry about the excessive verbosity, but I don't know if would have 
been easy to understand these error messages without the corresponding 
code.)

I don't see why it complains about a `free' `E' when it gets bound in 
the previous line.

I am using strings because it is easier for me to print. I don't know if 
it's possible to print names of predicates.
BTW, Curly is Curly Joe. ;-) I tend to think of him as just Joe.

On 17/09/12 00:15, Richard O'Keefe wrote:
> On 17/09/2012, at 12:26 AM, Prashanth wrote:
>
> The fundamental issue with negation is that many data structures have
> infinitely many instances, so that if p(X) has finitely many solutions
> not p(X) will have infinitely many.
>
>> Given that I don't want to write "unhappy(E) :- m.", my questions are:
>> 1. How do I get it to print ONE entity that is not happy? I tried "not happy(X), io.write_string(X, !IO)" but on further reading, discovered how the Goal for the "not" becomes part of an "if then else", and that the scope of X does not extend to the else.
> You have got to generate values for X explicitly and then test them.
>
> :- pred clown(entity).
> :- mode clown(out) is multi.
>
> clown(E) :- E = "j" ; E = "m" ; E = "l".
>
> :- pred unhappy_clown(entity).
> :- mode unhappy_clown(out) is multi.
>
> unhappy_clown(E) :- clown(E), not happy(E).
>
> (Seeing "moe" and "larry" I was expecting "curly", not "joe".)
>
>> 2. How do I get it to print ALL entities that is not happy?
> You really do NOT want to be defining entities to be strings,
> because presumably the strings "", "a", "aa", "aaa", "aaaa", ...
> are not happy.
>
> As a rule of thumb, if there a small finite set of values
> you are interested in, do not use strings for that.
>
>
> --------------------------------------------------------------------------
> 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
> --------------------------------------------------------------------------

--------------------------------------------------------------------------
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