I'm pretty new to Prolog, and I need some help with a small problem:
I'm trying to split a list of couples in two lists. The first list contains all the couples with the given key, the second list contains all the other objects.
This is the code I have so far:
splitList([],_,[],[]).
splitList([(A,X)|Rest], B, [Elem1|List1], [Elem2|List2]):-
(
A == B
->
Elem1 = (A,X),
splitList(Rest, B, List1, [Elem2|List2])
;
Elem2 = (A,X),
splitList(Rest, B, [Elem1|List1], List2)
).
When I try to test it, this is what I get:
[trace] [3] 143 ?- splitList([(1,yellow),(1,blue),(2,yellow),(2,blue)],1,X,Y).
Call: (37) splitList([ (1, yellow), (1, blue), (2, yellow), (2, blue)], 1, _G4821, _G4822) ? creep
Call: (38) 1==1 ? creep
Exit: (38) 1==1 ? creep
Call: (38) _G4928= (1, yellow) ? creep
Exit: (38) (1, yellow)= (1, yellow) ? creep
Call: (38) splitList([ (1, blue), (2, yellow), (2, blue)], 1, _G4929, [_G4931|_G4932]) ? creep
Call: (39) 1==1 ? creep
Exit: (39) 1==1 ? creep
Call: (39) _G4940= (1, blue) ? creep
Exit: (39) (1, blue)= (1, blue) ? creep
Call: (39) splitList([ (2, yellow), (2, blue)], 1, _G4941, [_G4931|_G4932]) ? creep
Call: (40) 2==1 ? creep
Fail: (40) 2==1 ? creep
Call: (40) _G4931= (2, yellow) ? creep
Exit: (40) (2, yellow)= (2, yellow) ? creep
Call: (40) splitList([ (2, blue)], 1, [_G4949|_G4950], _G4932) ? creep
Call: (41) 2==1 ? creep
Fail: (41) 2==1 ? creep
Call: (41) _G4958= (2, blue) ? creep
Exit: (41) (2, blue)= (2, blue) ? creep
Call: (41) splitList([], 1, [_G4949|_G4950], _G4959) ? creep
Fail: (41) splitList([], 1, [_G4949|_G4950], _G4959) ? creep
Fail: (40) splitList([ (2, blue)], 1, [_G4949|_G4950], _G4932) ? creep
Fail: (39) splitList([ (2, yellow), (2, blue)], 1, _G4941, [_G4931|_G4932]) ? creep
Fail: (38) splitList([ (1, blue), (2, yellow), (2, blue)], 1, _G4929, [_G4931|_G4932]) ? creep
Fail: (37) splitList([ (1, yellow), (1, blue), (2, yellow), (2, blue)], 1, _G4821, _G4822) ? creep
false.
The obvious solution should be X = [(1,yellow),(1,blue)] and Y = [(2,yellow),(2,blue)], but I get false instead. Can someone tell me what I'm doing wrong?
Thanks in advance,
Walle