Debugging 如何调试Prolog程序

Debugging 如何调试Prolog程序,debugging,prolog,Debugging,Prolog,很抱歉用这个简单的问题来打扰你,但是我现在花了2个小时来解决这个问题,但没有成功。我最大的问题是我不知道如何调试Prolog程序,这限制了我理解为什么这不起作用的能力。因此,我的问题是,我如何在某种调试器或帮助工具的帮助下,找出该程序为什么不能给出预期的结果: combinelists(L1|List1, L2|List2) :- write(L1), write(L2), nl, combinelists(List1, List2). printlist([

很抱歉用这个简单的问题来打扰你,但是我现在花了2个小时来解决这个问题,但没有成功。我最大的问题是我不知道如何调试Prolog程序,这限制了我理解为什么这不起作用的能力。因此,我的问题是,我如何在某种调试器或帮助工具的帮助下,找出该程序为什么不能给出预期的结果:

combinelists(L1|List1, L2|List2) :- 
    write(L1),
    write(L2),
    nl,
    combinelists(List1, List2).

printlist([L1|List]) :-
    write(L1), 
    nl,
    printlist(List).
以下是我得到的输出:

1 ?- printlist([egg,egg2]).
egg
egg2
false.

2 ?- combinelists([egg,egg2],[egg3,egg4]).
false.
在上一个案例中,我期望的结果是: 鸡蛋3 EGG2EG4 错

我尝试在SWI prolog中打开跟踪,得到了以下结果。然而,这并不能回答为什么输出是空的。什么样的工具能帮我摆脱困境。如果你知道这个问题的解决方法,我也将非常感激

[trace] 5 ?- combinelists([egg,egg2],[egg3,egg4]).
   Call: (6) combinelists([egg, egg2], [egg3, egg4]) ? creep
   Fail: (6) combinelists([egg, egg2], [egg3, egg4]) ? creep
false.

[trace] 6 ?- printlist([egg,egg2]).
   Call: (6) printlist([egg, egg2]) ? creep
   Call: (7) write(egg) ? creep
egg
   Exit: (7) write(egg) ? creep
   Call: (7) nl ? creep

   Exit: (7) nl ? creep
   Call: (7) printlist([egg2]) ? creep
   Call: (8) write(egg2) ? creep
egg2
   Exit: (8) write(egg2) ? creep
   Call: (8) nl ? creep

   Exit: (8) nl ? creep
   Call: (8) printlist([]) ? creep
   Fail: (8) printlist([]) ? creep
   Fail: (7) printlist([egg2]) ? creep
   Fail: (6) printlist([egg, egg2]) ? creep
false.

[trace] 7 ?- combinelists([egg,egg2],[egg3,egg4]).
   Call: (6) combinelists([egg, egg2], [egg3, egg4]) ? creep
   Fail: (6) combinelists([egg, egg2], [egg3, egg4]) ? creep
false.

为了使列表至少与一个元素匹配,您应该使用
[H | T]
而不是
H | T
。在你的第一句中,你遗漏了方括号。
–Tudor Berariu

为了将列表与至少一个元素匹配,您应该使用
[H | T]
而不是
H | T
。在你的第一句中,你漏掉了方括号。我爱你,@TudorBerariu!非常感谢你!调试器不可能帮我解决这个问题。如果你想理解Prolog,从没有副作用的程序开始。