我对Prolog比较陌生,需要在一个小问题上寻求帮助:
我试图将一组夫妇名单拆分成两个列表。第一个列表包含所有给定关键字的夫妇,第二个列表包含所有其他对象。
这是我目前的代码:
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)
).
当我尝试测试时,我得到了以下结果:
[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.
明显的解决方案应该是X = [(1,黄色),(1,蓝色)]和Y = [(2,黄色),(2,蓝色)],但我得到的是false。 有人能告诉我我错在哪里吗?
提前致谢,
Walle