I am using SICStus Prolog and have a set of facts:
student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths').
I want to get the shared subject of two students where both students are different, so I got:
sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).
However, when I enter:
sharedSubject('John Henry', F, E).
I get F = 'John Henry'
. Can someone point out where I am going wrong and what I need to do? Thanks.
Inequality Operator (=\=) If E1 and E2 do not evaluate to the same value, arithmetic expression E1 =\= E2 succeeds. For example: ?- 24 =\= 17+4. yes.
The = "operator" in Prolog is actually a predicate (with infix notation) =/2 that succeeds when the two terms are unified. Thus X = 2 or 2 = X amount to the same thing, a goal to unify X with 2. The == "operator" differs in that it succeeds only if the two terms are already identical without further unification.
Use dif/2
instead, or set the \==
at the end of the rule - which is not as safe as dif/2
. See also:
Difference between X\=Y and dif(X,Y)
What is the logical 'not' in Prolog?
Using \==/2 or dif/2
You must move the S1 \== S2
goal to the end as. If you call your sharedSubject/3
predicate with the second argument not instantiated, as in your sharedSubject('John Henry', F, E)
, the S1 \== S2
goal will always be true:
?- 'John Henry' \== S2.
true.
Also:
?- S1 \== S2.
true.
See the documentation of the standard (\==)/2
built-in predicate in your Prolog system documentation. In a nutshell, unless you want to test if two variables are the same, be sure that both arguments are instantiated when calling this term equality predicate.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With