【问题标题】:Prolog - an Aux predicate in a main predicateProlog - 主谓词中的辅助谓词
【发布时间】:2017-06-23 19:51:13
【问题描述】:
vecLine2BitLineAux([C | Cs],[P | Ps], N, LastP, LastC, BitLine) :-
    /* print(P), print(' '), print(C), print(' '), print(N),
       print(' '), print(LastP), print(' '), print(LastC),
       print(' '), print(BitLine), print('\n'), */
    vecLine2BitLineAux(Cs,Ps, N, P, C, Res),
    SpCnt is P-(LastP+LastC),
    /* print(SpCnt),print('\n'), */
    fill_char(SpCnt, ' ', Spaces),
    fill_char(LastC, '*', Stars),
    append(Stars, Spaces, Tmp),
    append(Tmp, Res, BitLine).

vecLine2BitLine(CList, [P | Ps], N, BitLine) :-
   P1 is P-1,
   vecLine2BitLineAux(Clist, [P | Ps], N, P1, 0, BitLine).

主谓词应该调用带有 2 个附加参数的 Aux 谓词,它们是 (P-1) 和 0,但它给出了错误的一些原因:

 Exception: (11) _L191 is 9- (5+_G559) ?

但是,如果我只是在下一个示例中运行 Aux 谓词,效果会很好:

vecLine2BitLineAux([1,2,1],[2,5,9],12, 1,0,BitLine).

任何人都知道为什么以及如何解决它?

【问题讨论】:

  • is/2 是表达式求值器,因此要求右侧表达式中的 所有 变量都绑定到数字。

标签: prolog predicate


【解决方案1】:

那里的错误信息基本上告诉你,在这个表达式中:

SpCnt is P-(LastP+LastC),

变量LastC 到达时没有绑定。

您没有包含足够的代码供我们真正调试,但我注意到,当我加载您的代码时,我收到了以下消息:

Warning: /Users/dlyons/Desktop/test.pl:11:
Singleton variables: [CList,Clist]

Prolog 非常区分大小写,您必须将 Singleton 变量警告视为严重错误! 如果您不这样做,您将得到损坏的代码。我认为如果您更正vecLine2BitLine/4 正文中的错字(调用CList Clist),问题可能会消失。

【讨论】: