2017-03-07 5 views
4

은 가정하자 나는 지식 기반을예/아니요 대신 프롤로그 답변을 알 수 있습니까? 우리는 우리가 그것을 주장하지 않았기 때문에 그것은 <strong>없는</strong>에 응답 할</p> <pre><code>|?- likes(mary,john) </code></pre> <p>여부 프롤로그 요구하는 경우에

likes(john,mary). 
person(mary). 
person(john). 

있습니다. 프롤로그 답변을 알 수 없도록 할 수있는 방법이 없습니까? 즉

\+ likes(mary,john) 

우리는 가능한보다는 거짓으로 결합되지 않은 표현을 치료 프롤로그 요청할 수 있습니다. 나는 실존 적 양화를 허용하고 거짓이 아닌 언 바운드 관계를 다루는 IDP 시스템을 사용 해왔다. 그러나 나는 더 많은 주류를 사용하고 싶다. 당신이 문 산출

vocabulary V{ 
    type Person 
    Likes(Person,Person) 
} 


theory T: V{ 

    //Everyone might like someone and disallow narcisiscm 
    !x : ?y: Likes(x,y) & ~Likes(x,x). 

} 

//some instance without special meaning 
structure S:V{ 
    Person={A..C} 
} 

procedure main(){ 
    //Print all possible solutions 
    printmodels(allmodels(T,S)) 
} 

을 할 수 IDP에서 예를 들어 http://adams.cs.kuleuven.be/idp/server.html

언급 한 바와 같이
Number of models: 27 
Model 1 
======= 
structure : V { 
    Person = { "A"; "B"; "C" } 
    Likes = { "A","B"; "A","C"; "B","A"; "B","C"; "C","A"; "C","B" } 
} 
//... 
+3

당신은 [Closed-world assumption] (https://en.wikipedia.org/wiki/Closed-world_assumption) 대 [Open-world assumption] (https://en.wikipedia.org/wiki)를 알고 있습니까?/열린 세계 _ 어설 션)? –

+0

프롤로그는 닫힌 시스템에만 응답 할 수 있다고 말하고 있습니까? 내가 공개 시스템을 고려해도되는지, 아니면 그런면에서 제한되어 있다고 말하면서 다른 언어를 사용해 봐야한다고 생각할 수 있습니다. – awiebe

+0

'mary'와'john'이 사람이기 때문에'likes (mary, john)'이 성공합니다. 두 번째 절에서 말하는 것입니다. –

답변

2

, 사실에 해당하는 경우 프롤로그 묻는 즉, 닫힌 세계 가정을 사용하고 있습니다 우리가 그것이 사실인지를 물어 본다는 것을 의미합니다. no은 그것이 사실인지 아닌지를 우리가 알지 못한다는 것을 의미합니다. 물론, 튜링 완전한 언어 인 당신이 열려있는 세계를 시뮬레이션 할 수 있습니다 - 무엇인가 : 아마 가장

like(true, mary, john). 
like(false, mary, nick). 
like(unknown, X, Y). 

(예를 들어, 한 쌍 모두 사실과 거짓을 갖는) 가장자리의 경우를 다루는 몇 가지 추가 래퍼를 가지고, 어쩌면 일부 고차원 술어를 사용하여 많은 상용구를 작성하는 것을 피할 수 있습니다. 그러나 구현의 핵심은 사용자가 명시 적으로 허위 사실을 선언하고 나머지 사실을 알 수 없도록하는 것입니다. 지금까지 말한 것을

+0

나는 edge case를 잡는 더 합리적인 정의가 like (unknown, X, Y) : \ + like (true, X, Y), \ + (false, X, Y)와 같다고 생각한다. " – awiebe

+0

@ awiebe yep, 그것은 그것을 지워 버린다. - 'like (true, mary, john)를 가질 기회는 여전히 있지만. 아마도 우연히, (거짓, 마리아, 존)'과 같은 것일 수 있습니다. 일반적으로 "순수한"데이터와 관련 논리에 대해 별도의 술어가있는 경우이를 추론하는 것이 더 쉽습니다. –

1

아주 적합한 : 프롤로그는   휴일 소위하에 운영 세계 가정   (CWA). 아직 게시 된 내용 외에 보완적인 관점을 제시하고자합니다.

첫째, 프롤로그 프로그램도 을 종료하지 않을 수 있으며, 그래서 우리는 당신이 언급 가능한 답변 중 하나를 수신하지 않을 수 있습니다.

그러나을 수행 프로그램이 종료 되더라도, 우리는 여전히falsetrue에도 동일 답변을받을 수 있습니다. GNU 프롤로그를 사용하여 예를 들어

: 여기

 
| ?- X #\= 3. 

X = _#2(0..2:[email protected]) 

는, 대답은 보류 제약, 그 진실이 확실히 결정되지 않기 때문에 넙치에게 말씀하는 목표입니다.

이러한 대답은 일 수도 있고 대답하지 않을 수도 있습니다.은 솔루션을 설명합니다.예를 들어

:이 경우

 
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1). 

X = _#2(0..1) 
Y = _#20(0..1) 
Z = _#50(0..1) 

yes 

, 어떤 솔루션은 존재하지 않습니다!

 
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1), 
    fd_labeling([X,Y,Z]). 

no 

따라서, 위의 예에서, 정말 maybe 대신   yes로 대답하는 것이 더 바람직 할 수있다 :이 문제를 확인하려면, 우리는 그들에 대한 명시 적 검색해야합니다.

또한 정수에 대한 추론을 할 때과 같은 문제는 어쩔 수없는 기본 논리 정리에서 알 수 있습니다.

은 이러한 의미에서, 프롤로그 시스템은 정말 그 진실하지   만 가 아닌 답을 줄 수 있지만, 또한 는   확인할 수 없습니다.