프롤로그는 정말로 닫힌 세계 가정을 기반으로합니까?
세 이하 닫힌 세계 가정 ,
현재 사실로 알려지지 않은 것은 거짓입니다.
Prolog의 의미는 종종 폐쇄 세계 가정을 따른다고합니다. 예를 들면 다음과 같습니다 .
Prolog는 CWA (Closed World Assumption)에 기반합니다. 즉, 제안이 사실 데이터베이스에없고 사실 데이터베이스에서 파생 될 수없는 경우 사실이 아닙니다.
그러나 이것은 그렇게 작동하지 않습니다. CWA에서는
?- a.
false.
그러나 대신 SWI-Prolog에서 다음을 얻습니다.
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
왜 그런 겁니까? Prolog가 CWA를 기반으로한다고 말하는 것이 잘못입니까?
답변
프롤로그의 맥락에서 닫힌 세계 가정 (CWA)에 대해 이야기 할 때, 구별 사이에 이루어져야 알 수없는 대 조건 을 알고 (런타임) 시스템에 술어. 두 경우 모두 절이 있거나없는 술어.
알 수없는 술어를 호출하면 기본적으로 술어 존재 오류가 발생합니다. unknown
기본값이 error
이며로 설정할 수 있는 표준 플래그 가 있습니다 fail
. 그것은 당신이 분명히 찾고있는 행동을 줄 것입니다. Sill, error
프로그래밍 술어 (예 : 술어 이름 또는 배열의 오타)를 더 쉽게 감지 할 수 있도록 플래그를 기본값 인으로 유지하는 것이 좋습니다 .
어떤 술어하게 알려진 런타임에를? 술어 지시문 또는 술어 절. 가장 익숙한 예는 dynamic/1
지시문입니다. 코드가 다음 텍스트로만 구성된 경우 :
:- dynamic(foo/1).
그런 다음 컴파일하고로드 한 후 다음을 예상 할 수 있습니다.
?- foo(_).
no.
그러나 다른 지시문은 동일한 효과를 갖습니다 (예 : multifile/1
및 discontiguous/1
, 이것이 표준 준수 Prolog 구현이라고 가정합니다!).
따라서 알려진 술어의 경우 Prolog에서 CWA의 해석은 간단합니다. 사실임을 증명할 수없는 것은 거짓입니다. 즉 고장에 의한 부정 이며, 하지 와 동일한 논리 부정 . Prolog라는 이름 은 논리 프로그래밍에서 비롯 되었지만 Prolog는 또한 실용적이고 실용적인 프로그래밍 언어를 목표로합니다.
프롤로그에서 부족한 (그리고 예에 의해 제공됩니다 무엇 Logtalk 할 수있는 경우) 선언 술어를 하지 않고하는 것은 (예를 들어,이 참조 동적으로 선언 강제로, 또는 다중 파일, 또는 ... 또는 그것을 제공하는 조항을 요구하고 예 ). 이것은 더 간단하고 명확한 CWA 의미 체계를 제공합니다. 선언 된 술어를 절없이 호출하면 실패합니다 (문제가있는 unknown
플래그 를 엉망으로 만들 필요없이 ); 선언되지 않은 술어를 호출하면 술어 존재 오류가 발생합니다.
도움이 되었기를 바랍니다. 실패 로 부정을 검색하면 추가 설명을 제공해야합니다.
질의는 언어 자체로되어 있어야합니다. 왜냐하면 a
명제가 a/0
되려면 조건 자로 정의 된 언어로되어 있어야합니다. 언어의 모든 nullary 술어는 명제입니다. 새 용어를 먼저 언어에 추가하지 않고는 조건 자로 쿼리 할 수 없습니다.
들어 a/1
방금로 정의 할 때 a(b).
그것은 언어에, 다음 쿼리는 a(X), dif(X,b)
프롤로그 시스템이 만족하고 주변 세계를 가정하고 다른이없는 다른 용어를 알고하지 않기 때문에 실패합니다.