2017-11-11 5 views
1

나는 프롤로그를 지금 이해하는 것을 시도한다. 내가 입력을주고 싶어 : 변환 (들 (S (S (X))), Y) 및되어야 출력 Y = 3프롤로그와 정수 반환

convert(s(0), 1). 
convert(s(s(0)), 2). 
convert(s(X),Y) :- convert(X,Y is (Y+1)). 

그 내 규칙은 바로 지금,하지만 입력 : convert (s (0), 1). 그리고 convert (s (s (0)), 2). 작업.

내 재귀가 올바르게 작동하면 convert (s (s) (0)), 2) 규칙이 필요하지 않습니다. 누군가가 그 문제를 도와 줄 수 있습니까?

여기에 두 가지 문제가 있습니다

답변

1

접견 :

  • Y is Y+1는 프롤로그에서 어떤 의미가없는이;
  • 실제로 여기에 펑터이 작성되어 있습니다.

프롤로그가 전화로이 문제를보고 : is(Y,Y+1)라는 하지이지만, 펑로 전달

convert(X,is(Y,Y+1)) 

. 프롤로그에는 명확한 입출력이 없습니다. 술어를 호출하고 통합을 통해 결과를 얻습니다. 0convert/2 물론 0이다 :

우리는 그러나 재귀를 사용하여 문제를 해결할 수

convert(s(X),R) :- 
    convert(X,Y), 
    R is Y+1. 
:

convert(0,0). 

s(X)의 변환을 X 플러스 하나의 변환이다

또는 다음을 함께 입력하십시오.

convert(0,0). 
convert(s(X),R) :- 
    convert(X,Y), 
    R is Y+1. 

이제 Peano 숫자를 숫자로 변환하고 해당 숫자를 나열하고 피아노 숫자를 숫자로 변환하는 술어를 호출 할 수 있습니다. Peano 번호가 정상 번호 인지도 확인할 수 있습니다.

불행히도 주어진 숫자에서 Peano 번호를 얻기 위해이 술어를 사용할 수 없습니다 : Peano 번호와 통합되지만 다른 Peano 번호를 찾으려고 할 때 무한 루프에 빠지게됩니다.

우리는이 우리에게 도움이되는 clpfd 라이브러리를 사용할 수 있습니다 :

:- use_module(library(clpfd)). 

convert(0,0). 
convert(s(X),R) :- 
    R #> 0, Y #= R-1, 
    convert(X,Y).
+0

덕분에, 그것을 작동합니다! 그러나 R과 같은 큰 글자를주는 것이 중요한 이유는 무엇입니까? convert (s (X), R) 하지만 왜 (s (X), r)가 변환되지 않습니까? – Runner

+1

@Runner : 변수가 대문자로 시작하기 때문에 상수는 소문자입니다. 이는 관례가 아닙니다 (그렇게하지 않으면 프로그램이 잘못 될 수 있습니다). 짜증나는 소리를 내지 않고도 프롤로그에 대한 몇 가지 기본 사항을 찾아야합니다. –

+0

올바른 동안 많은 임시 변수가 필요하므로 clpfd 버전은 매우 비효율적입니다. 효율적인 버전은 어떻습니까? 아, 그리고 s (X), 참으로. – false