2016-09-24 12 views
1

나는 프롤로그를 배우는 중이며 머리를 쓸 수 없다.Prolog Unification with not()

은 가정하자 나는 value(v)가 올바른 입증 할 수 그래서 a(v)., 나를 거짓주는 다음 프로그램을

value(v). 

a(X) :- not(value(X)). 

있습니다.

사실은 value(w)이 아니므로 나에게 사실을 알려줍니다. 그러므로 시도해 보더라도 올바른 것으로 입증 될 수 없습니다.

내 이해에 따라 a(X).을 요청하면 value(X)을 의미없는 첫 번째 값을 제공해야합니다. value(v) 만 정확하므로 무한한 가능성이 있어야합니다.

그러나 Prolog가 계속 대답하는 이유는 무엇입니까 false?

+1

어떻게 보이 느냐에 따라 *** 위조 ***, 틀린 것은 무엇입니까? 어떤 것이 틀렸다는 것을 어떻게 증명합니까? 그것의 한 가지 견해는 증명할 수없는 모든 것은 거짓입니다 *는 당신이 모든 것이 진실 인 ***이 증명할 수있는 세계에 살고 있다고 상상하는 견해입니다 (그것은 논쟁의 여지가 있습니다). 프롤로그에서'\ +'연산자는 실패 의미로 부정으로 작동합니다. 이것은 위에서 설명하려고했던 것입니다. 희망은 그 단서를 제공합니다. – Limmen

+0

예, false를 증명할 수 없다고 정의하면 Prolog는 올바른 것으로 증명할 수없는 예제를 제공하여 목표를 달성 할 수 있습니까? – user3207838

+0

하지만 문제는 프롤로그가 항상 ** 사실 **을 만들기 위해 노력하고 있다는 것을 추측합니다.이 경우 엔진을 기본적으로 뒤집을 수 있습니까? – user3207838

답변

2

먼저 ISO 술어 (\+)/1을 사용하십시오.not/1입니다.

둘째, 용어의 disequality을 표시하기 위해 (\+)/1를 사용하지 마십시오 : (\+)/1는 프롤로그에서 불완전, 따라서 논리적으로 소리가 없습니다. 이 아니며 논리적 인 의 부정 인이 아니라 "  증명 가능"을 나타냅니다.

귀하의 경우

: 쿼리를 성공하게 인스턴스화가 있지만 ?- value(X). 성공, 그래서 증명할 것입니다, 그래서 ?- \+ value(X).이 실패합니다.

특히, ?- \+ value(a).입니다.

그래서 우리는이 :

 
?-  \+ value(V). 
false. 

그러나 보다 구체적인 쿼리는 성공 :

 
?- V = a, \+ value(V). 
V = a. 

이것은 분명히 우리가 순수한 관계에서 기대하는 논리적 특성에 위배된다. 을 참조하십시오.

는 용어의 disequality을 표시 dif/2 사용합니다. Prolog 시스템이 dif/2을 지원하지 않는다면 포함 시키거나 논리적으로 안전한 대략적인 접근으로 iso_dif/2을 사용하십시오. 자세한 내용은 을 참조하십시오.

+0

알겠습니다. 이해합니다. 따라서 원하는 기능을 수행하기 위해 Prolog는 디자인 상으로는 불가능한 보완 할 수없는 예를 제시해야합니다. 기본적으로, Prolog에서 이것을 구현할 수 있지만 (아마도 원치는 않지만) 내가 언급 한 동작을 얻으실 수 있습니까? 아니면 기본적인 논리 개념을 놓치고 있습니까? – user3207838

+0

당신의 경우에는'dif/2' 또는 다른 제약 조건을 사용하여 불균형을 표현할 수 있습니다 :'dif (X, v)'는'X'가 **'**''와는 다른 **임을 나타냅니다. 목표가 파악되지 않는 한 잔여 목표 *를 남긴 채로 성공합니다. 다른 도메인의 경우 유사한 유사성이 있습니다. 예를 들어'X # \ = 3'은'X'가 3과 다른 ** 정수 **라는 것을 나타냅니다. – mat

1

프롤로그는 "폐쇄 된 가정"하에 작동합니다. – 그것은 우리가 말한 것에 대해서만 알고 있습니다. 특히 에 대해에 대해 w, u 또는 기타 자료를 언급 했으므로 어떻게 제작할 수 있습니까? 그리고 wu 앞에 오는 이유는 무엇입니까?

수 재치있는 유일한 것은 (X, dif(X,v))을 생산하지만,이 다른 질문에 대한 대답, 즉, 것 "어떻게 a(X) 증명할 수 있도록?", Prolog가 실제로 대답하는 것은 아니며, 즉 은 "a(X)은 증명할 수 있습니까?".

, 당신의인지 적 부담을 완화 true에서 Yes에 당신의 머리에 프롤로그 프롬프트의 응답을 이름을 변경하고, false에서 No로합니다.

Yes은 Prolog가 "예, 증명할 수 있습니다!"라고 말하면 No – "아니, 증명할 수 없습니다."

으로 변경하지 않음은 \+not_provable으로 수정합니다.