접견 :
Y is Y+1
는 프롤로그에서 어떤 의미가없는이;
- 실제로 여기에 펑터이 작성되어 있습니다.
프롤로그가 전화로이 문제를보고 : is(Y,Y+1)
라는 하지이지만, 펑로 전달
convert(X,is(Y,Y+1))
. 프롤로그에는 명확한 입출력이 없습니다. 술어를 호출하고 통합을 통해 결과를 얻습니다. 0
의 convert/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).
덕분에, 그것을 작동합니다! 그러나 R과 같은 큰 글자를주는 것이 중요한 이유는 무엇입니까? convert (s (X), R) 하지만 왜 (s (X), r)가 변환되지 않습니까? – Runner
@Runner : 변수가 대문자로 시작하기 때문에 상수는 소문자입니다. 이는 관례가 아닙니다 (그렇게하지 않으면 프로그램이 잘못 될 수 있습니다). 짜증나는 소리를 내지 않고도 프롤로그에 대한 몇 가지 기본 사항을 찾아야합니다. –
올바른 동안 많은 임시 변수가 필요하므로 clpfd 버전은 매우 비효율적입니다. 효율적인 버전은 어떻습니까? 아, 그리고 s (X), 참으로. – false