如何调试Prolog程序

时间:2014-12-14 01:53:45

标签: debugging prolog

很抱歉打扰这个简单的问题,但我现在花了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.

我在上一个案例中期待的输出是: eggegg3 egg2egg4 假的。

我尝试在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.

1 个答案:

答案 0 :(得分:0)

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