2016-09-21 2 views
1

저는 프롤로그에 매우 익숙합니다. 가능한 한 적은 시간에 최대한 많이 배우려고합니다. 어떤 도움이라도 대단히 감사합니다. MacOS Sierra를 사용하고 있습니다. 나는 프롤로그 명령 창을이 명령을 실행하여 테스트 할 때Prolog Wrong Compilation?

nextto(_A,_B). 
nextto(_B,_C). 

것은 :이 아닌가요

?- nextto(A,C). 

을 false를 반환하는

나는이 라인 입력에 노력하고 있어요?

때문에이 같은 사실 내 컴파일 결과 : 프롤로그 _에서

?- nextto(A,C). 
true 
+0

내가 그 nextto (A 방식으로 코딩 할 필요를, 기음). 거짓입니다. – SAN

+0

nextto (A, C)에서는 이것이 가능하지 않다고 생각합니다. 왜 nextto (a, c)를 사용하지 않을까요? – coder

+0

오케이! 정말 고맙습니다!! 그냥 호기심이 궁금해서 대문자로는 얻을 수있는 방법이 없습니까?! – SAN

답변

1

가 대문자 같은 것으로 간주하고 _A, 익명의 변수를 지정하는 것입니다 그래서 자신의 특별한 의미를 가지고있다, _B는 (익명) 변수입니다 (prolog에있는 대문자로 시작하는 것이 가변적이며 원자가 아닙니다). 귀하의 조항 :

nextto(_A,_B). nextto(_B,_C). 

실제로는 술어 nexxto가 두 개의 변수로 성공한다는 것을 의미합니다. 그래서 neexto (A, C)를 질의 할 때. 그것은 사실을 반환합니다. nextto (a, b)를 쿼리하면 true를 반환합니다. 여기서 a, b는 원자가 아닌 변수이고, nextto (a, b)가 있는지 검사 할 것이기 때문이다. 당신의 절에서. 그러나 위에서 말했듯이 당신의 절은 _A, _B의 모든 통일에 성공합니다.

nextto(_A,_B). 

대신 : 당신의 술어 nexxto이 항상 성공 이후 또한 당신도 오직 한 절 쓰기와 같은 결과를 얻을 것

nextto(_A,_B). nextto(_B,_C). 
+0

'_'은 대문자로 간주되지 않습니다. 이 문맥에는 익명의 변수를 지정하는 특별한 의미가 있습니다. 즉, 프롤로그에게 가치에 대해 신경 쓰지 않는다고 말할 수 있습니다. 예를 들어,'foo (_A) .'는 * 싱글 톤 변수 * 경고를 생성하지 않지만'foo (A) .'는 생성합니다. – lurker

+0

네, 절대적으로 옳습니다. 저는 자본주의로 간주됩니다. 저는 변수처럼 행동 할 것이며, 그것을 지적하기위한 감사의 말로는 말하지 않겠습니다. !!! 나는 그 부분에서 더 명확하게 대답을 편집 할 것입니다 ... – coder