2013-05-27 4 views
3

: 주어 졌을 때 술어 이름 s2int : 그것은 샤 우드기본 PROLOG 계산 나는 다음과 같은 계산 술어 쓰기 위해 노력하고있어 프롤로그에 새로 온 사람

  • s2int (0, Y) "를 반환 "Y = 0.
  • s2int (s (0), Y) => Y = 1.
  • s2int (s (s) (0)), Y) => Y = 2.
  • s2int (S (s (s) (0))), Y) => Y = 3.

등등 .. 여기 내가 (매우 저조한) 작성했는데, 처음에는 내가이 코드 뭘하려 :

s2intAux(0,Y). 
s2intAux(X,Y):- X = s(Z) ,Y1 is Y+1, s2intAux(Z,Y1). 

을하지만 난 (s2intAux를 입력하여 실행하려고 할 때마다 (0), Y) "오류 :/2 : 인수가 충분히 인스턴스화되지 않았습니다"라는 오류 메시지가 나타납니다. Y가 정의되지 않았기 때문에 오류가 발생합니다.

내가 왜 지금 몇 시간 붙어 봤는데 (내가 값을 0으로 Y를 시작하려고하지만,이 일이 전혀 작동하지 않았다)
s2intAux(0,Y). 
s2intAux(X,Y):- X = s(Z) ,Y1 is Y+1, s2intAux(Z,Y1). 

s2int(X,Y):- Y1 is 0, s2intA(X,Y1). 

인 : 다음 나는이 하나의 시도 너희들을 돌보고있어, 제발 도와 줘! 감사합니다.

답변

2

당신은 가장 사소한 사건 해결하려면 다음이 필요합니다 Y가 당신의 후속 행에서 0

에 인스턴스화 될 때이 s2intAux(0,Y) 사실이 원인이됩니다

s2intAux(0,0). 

을, 당신은하지 않습니다 s(.)을 다 썼을 때 Z을 0으로 처리하는 설명입니다. 이를 위해서는 단일 s(0) 케이스를 처리해야합니다. 그럼 당신은 일반적인 경우를 수행 할 수 있습니다

s2intAux(X,Y) :- X = s(0), Y is 1. 
s2intAux(X,Y) :- X = s(Z), s2intAux(Z,Y1), Y is Y1 + 1. 

참고 일반적인 경우에, 우리는 우리가 다시 해명 마지막 Y to Y1 + 1을 할당 할 수 있습니다 전에 Y is 1에 도착 아래로 통과 할 수 있다고.

당신은 또한 마찬가지로 그 첫 줄을 쓸 수 있습니다 :

s2intAux(0,0). 
s2intAux(s(0),Y) :- Y is 1. 
s2intAux(X,Y) :- X = s(Z), s2intAux(Z,Y1), Y is Y1 + 1. 
:

s2intAux(s(0),Y) :- Y is 1. 

최종 답변은 다음과 같습니다