You need to read up on operator precedence and associativity.
;/2
(logical OR) has different precedence than does ,/2
(logical AND). That means your expression doesn't bind the way you think it does. An expression like
A ; B , C
could bind as either
( A ; B ) , C
A ; ( B , C )
And the binding is controlled by operator precedence and associativity. Given your problem statement, "This query gives me 'mary jane' who lives in darwin, but does not have a car.", which binding do you think you got?
Try using parentheses to make your intent explicit. Even better, don't use ';/2'. Say something like this:
has_a_car(X) , lives_in(X,City) , member(City,[darwin,keynes]).
It should be noted that you'd have the same problem in most languages other than prolog as well. For instance, C/C++/C#/Java etc., an expression like
if ( A || B && C ) ...
will have exactly the same issue.