Recursion 导致参数为';不正确

Recursion 导致参数为';不正确,recursion,prolog,Recursion,Prolog,我有一段序言代码: my_avalia(A, R) :- A == "Koza" -> koza(R, 0, 0, e, 89). koza(R, _, _, _, 87) :- !, write(R). koza(R, X, Y, V, C) :- movex(V, X, X1), movey(V, Y, Y1), confirma(X1, Y1, Z), Z == 1 -> (append(R, [emFrente],

我有一段序言代码:

my_avalia(A, R) :-
    A == "Koza" -> koza(R, 0, 0, e, 89).

koza(R, _, _, _, 87) :-
    !,
    write(R).

koza(R, X, Y, V, C) :-
    movex(V, X, X1),
    movey(V, Y, Y1),
    confirma(X1, Y1, Z),
    Z == 1 -> (append(R, [emFrente], U),
            L is (C - 1),
            koza(U, X1, Y1, V, L)).
问题是,当我在koza()处写入“R”时,它的值是正确的,但是当我这样调用它时,它在我的_avalia中以一个空列表结束:

我的阿瓦利亚(“科扎”,R)

我的递归可能不正确,但我真的不知道它到底出了什么问题。 提前谢谢

其他职能:

movex(X,Y,R):-(X==o)->(R is Y-1).
movex(X,Y,R):-(X==n)->(R is Y).
movex(X,Y,R):-(X==s)->(R is Y).
movex(X,Y,R):-(X==e)->(R is Y+1).

movey(X,Y,R):-(X==n)->(R is Y-1).
movey(X,Y,R):-(X==s)->(R is Y+1).
movey(X,Y,R):-(X==o)->(R is Y).
movey(X,Y,R):-(X==e)->(R is Y).

confirma(X,Y,R):-(santafe(X,Y),R is 1); (R is 0).
我想出来了。。真是个愚蠢的错误。

koza([], _, _, _, 87) :-!.
koza(R, X, Y, V, C) :-
    movex(V, X, X1),
    movey(V, Y, Y1),
    confirma(X1, Y1, Z),
    Z == 1 -> (L is (C - 1),
            koza(U, X1, Y1, V, L),
            append(U, [emFrente], R)).

谢谢。

emFrente来自哪里?这应该是一种算法,可以为蚂蚁生成命令。这些命令是正确的行动,以使蚂蚁挑选所有的食物在一个线索。我只包含了函数的一部分,但你明白了。顺便说一句,“emFrente”在我的语言中的意思是“直走”。我对你的问题没有答案,但在我看来,你可以用movex(o,Y,R)这样的语法简化movex和movey谓词:-R是Y-1。等这同样代表你的my_avalia谓词。@Paulonnes将你的解决方案作为答案发布,并接受它。
koza([], _, _, _, 87) :-!.
koza(R, X, Y, V, C) :-
    movex(V, X, X1),
    movey(V, Y, Y1),
    confirma(X1, Y1, Z),
    Z == 1 -> (L is (C - 1),
            koza(U, X1, Y1, V, L),
            append(U, [emFrente], R)).
koza([], _, _, _, 87) :-!.
koza(R, X, Y, V, C) :-
    movex(V, X, X1),
    movey(V, Y, Y1),
    confirma(X1, Y1, Z),
    Z == 1 -> (L is (C - 1),
            koza(U, X1, Y1, V, L),
            append(U, [emFrente], R)).