2014-03-13 2 views
0

나는 주어진리스트의 K 번째 엘리먼트를 찾는 프롤로그 코드를 가지고있다.왜이 Prolog 코드가 작동하지 않습니까?

이 코드는 작동하지 않습니다.

element_at(X,[X|_],1) :- !. 

element_at(X,[_|T],K) :- element_at(X,T,K-1). 

그러나이 코드를 약간 수정하면 작동합니다.

element_at(X,[X|_],1) :- !. 

element_at(X,[_|T],K) :- K1 is K-1,element_at(X,T,K1). 

왜 K1과 같은 것이 필요한가요?

답변

0

K-1과 같은 표현식을 prolog의 술어에 인수로 전달하면 prolog가 다른 언어와 마찬가지로 표현식을 평가하지 않습니다. 귀하의 술어에 표시된대로 이라는 단어가 K 인 것으로 전달됩니다.

자, 가정하자 당신은 조회 :

element_at(X,[_|T],K) :- element_at(X,T,K-1). 

그리고 재귀 쿼리 :

element_at(X, [1,2], 2). 

그런 다음 쿼리가 술어의 두 번째 절 일치합니다

element_at(X, [2], 2-1). 

을이 것 두 번째 절을 다시 일치시키고 쿼리 :

element_at(X, [], 2-1-1). 

귀하의 조항과 일치하지 않으므로 실패합니다. 당신이 지연된 평가를 할 수

K1 is K-1, 
element_at(X, T, K1). 

참고 : 인수로 식의 값을 전달하려는 경우가 K1와 함께했던 것처럼

따라서, 당신은, 사전에 평가해야합니다. 예를 들어이 경우

foo(X, Y) :- 
    Y is X * 2. 

| ?- X = 1, foo(X-3, Y). 

X = 1 
Y = -4 

yes 
| ?- 

, foo를 쿼리, 그것은 foo(1-3, Y)으로 조회합니다. foo이 실행되면 Y is X * 2 행을 실행하여 Y is (1-3)*2이 산출되어 Y=-4이됩니다.

관련 문제