2011-11-30 2 views
0

그래서 프롤로그이 코드 조각이 :결과가 정확하지

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)). 

사정 내가) 코자에서 "R"(쓸 때, 그것은하지만, 정확한 값을 가지고 있다는 것입니다 다음과 같이 호출하면 my_avalia에 빈 목록이 생깁니다.

my_avalia ("Koza", 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)). 

감사합니다.

+0

emFrente는 어디서 오는가? – m09

+0

이것은 ant에 주문을 생성하는 알고리즘으로되어 있습니다. 그 명령은 개미가 모든 음식을 흔적에 고르도록하기위한 올바른 행동입니다. 함수의 일부만 포함 시켰지만 아이디어를 얻었습니다. 그건 그렇고, "emFrente"는 내 언어로 "곧장 앞으로"라는 뜻입니다. –

+1

당신의 문제에 대한 해답이 없지만 movex (o, Y, R)와 같은 구문을 사용하여 movex와 movey 술어를 간소화 할 수 있습니다. - R은 Y -1입니다. 등등 ... my_avalia 술어도 마찬가지입니다. – m09

답변

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)). 
관련 문제