Prolog语法与谓词逻辑

Prolog语法与谓词逻辑,prolog,Prolog,我在这一点上有两个异常(THIS-RTE)和(其他RTE),我无法修复它。任何人都可以给我一个关于我做错了什么的提示,因为我很确定我把事情搞砸了。谢谢 decomp([],[],0,0). decomp([E|T],R,P,I):- 0 is mod(E,2), decomp(T,R1,P1,I), R is [E|R1], %**(*THIS-RTE*)** ERROR: is/2: Type error: `[]' expected, found `[2|_G7

我在这一点上有两个异常(THIS-RTE)和(其他RTE),我无法修复它。任何人都可以给我一个关于我做错了什么的提示,因为我很确定我把事情搞砸了。谢谢

decomp([],[],0,0).
decomp([E|T],R,P,I):-
    0 is mod(E,2),
    decomp(T,R1,P1,I),
    R is [E|R1],    %**(*THIS-RTE*)** ERROR: is/2: Type error: `[]' expected, found `[2|_G7167]' ("x" must hold one character)
    P is 1 + P1.
decomp([E|T],R,P,I):-
    not(0 is mod(E,2)),
    decomp(T,R1,P,I1),
    R is append(E,R1,R), %**(*Other-RTE*)** ERROR: d:/../../../../lab1a.pro:47: evaluable `append(_G5550,_G5551,_G5552)' does not exist, but my clause is right ther
    I is 1 + I1.

append(E,[],[E]).
append(E,[A|St],[A|Et]):-
    append(E,St,Et).

您的语法有点不正确:

  • R是append(E,R1,R)
    应该只是
    append(E,R1,R)
    ,因为您正在传递
    R
  • R是[E | R1]
    应该直接进入规则的标题
结果应该如下所示:

decomp([],[],0,0).
decomp([E|T], [E|R1], P, I):-
    0 is E mod 2,
    decomp(T,R1,P1,I),
    P is 1 + P1.
decomp([E|T],R,P,I):-
    1 is E mod 2,
    decomp(T,R1,P,I1),
    append(E,R1,R),
    I is 1 + I1.

is
用于对右侧表达式进行算术计算,并分配给左侧的变量。不适用于一般分配或统一。因此,
R是[E|R1]
(算术求值赋值)应该是
R=[E|R1]
(统一)。此外,prolog谓词不是返回值的函数,因此
R是append(E,R1,R)
是错误的,正如@dasblinkenlight在他的回答中所示。而且,正如他指出的那样,
R=[E | R1]
统一可以更方便地在规则的标题中处理。通常
append([a],[b],[a,b])
是真的。在swi prolog中使用另一个名称.Ps,如果您在一个文件中覆盖了一个定义并加载了它,它将使用该定义而不是默认libs中的定义。@false,只有两个值
mod 2
可以使用,我认为一个和另一个一样好。不过,我确实喜欢
1是E mod 2
更好,因为它看起来更像“Prolog”-ish(因此我在另一个子句中固定了
mod/2
的调用,以匹配该语法:)在任何情况下,与一般
Expr=\=0
相反的不是
0是Expr
,而是
0==Expr
。因为
0=:=0.0