Prolog语法与谓词逻辑
我在这一点上有两个异常(THIS-RTE)和(其他RTE),我无法修复它。任何人都可以给我一个关于我做错了什么的提示,因为我很确定我把事情搞砸了。谢谢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
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