Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prolog: inequality operator

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.

like image 585
Hydar77 Avatar asked Nov 15 '13 20:11

Hydar77


People also ask

Which operator are used for inequality in Prolog?

Inequality Operator (=\=) If E1 and E2 do not evaluate to the same value, arithmetic expression E1 =\= E2 succeeds. For example: ?- 24 =\= 17+4. yes.

What does == mean in Prolog?

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.


2 Answers

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

like image 195
false Avatar answered Sep 21 '22 14:09

false


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.

like image 29
Paulo Moura Avatar answered Sep 22 '22 14:09

Paulo Moura