2017-10-24 1 views
1

프롤로그를 배우려고하는데 지식 기반에 사실이 없거나 사실이 정확하지 않으면 쿼리 결과에 영향을 미치기 때문에 지식의 완전성이 매우 중요해 보입니다. . 나는 사실에 대해 알려지지 않은 세부 사항을 어떻게 다뤄야하는지 궁금하다. 예를 들어, 내가 지식 기반에 추가지식베이스의 프롤로그 알 수 없음

%life(<name>,<birth year>,<death year>) 
%ruler(<name>,<precededBy>,<succeededBy>) 

어떤 사람들은 여전히 ​​그러므로 죽음의 임기를 알 수없는, 살아있을 것입니다. 통치자의 예에서 첫 번째 통치자는 전임자가 없었고 현 통치자는 후임자가 없었습니다. 이 알 수없는 것들이있는 경우에는 알려지지 않은 깃발 값을 넣어야하는지 아니면 세부 사항을 빠뜨리지 않으면 안됩니까? 통치자의 경우, 전임자를 모른 채 사실은 이렇게 보일까요?

ruler(great_ruler,,second_ruler). 
+0

당신은 보통 * 무료 변수를 사용 *을 사용하여이 문제로 연결되지 않는 표현을 선호하는, 그래서를 'X' (그러나 이것은 경고를 줄 것입니다), 그래서 익명의 자유 변수'_'. –

답변

1

글쎄, 몇 가지 옵션이 있습니다.

이 특별한 경우 디자인에 의문이 생깁니다. 이 술어는 단순히 아마 인, great_ruler에 대한

ruler(great_ruler, second_ruler). 
ruler(second_ruler, third_ruler). 

previous(Ruler, Previous) :- ruler(Previous, Ruler). 

을 실패 적절한-이 아무도 없었다 : 오히려 이전 찾기 위해 이전과 통치자, 당신이 바로 옆에두고 규칙을 사용할 수 있습니다 옆에 모두 넣는 것보다 결국 그들 앞에.

다른 경우에는 간단하지 않을 수 있습니다. 따라서 알 수 없음에 대한 명시 적 값을 만들지 또는 변수를 사용할지 결정해야합니다.

ruler(great_ruler, unknown, second_ruler). 

또는 당신이하고 싶은 수행 : 일부 사용자 정의 로직을 작성하지 않는 한, 당신은 가짜 답변 unknown을 특징으로 얻을 수있는 첫 번째 경우에

ruler(great_ruler, _, second_ruler). 

을 기본적으로, 당신은이 작업을 수행 할 수 할 그것을 잡으려고.

ruler(_, SucceededHimself, SucceededHimself) 

은 성공할 것이다, 예를 들면 아마 무엇 인 SucceededHimself = second_ruler 통일 :하지만 실제로 쿼리를 많이 이상한 결과를 얻을 수 있도록 그 빈 변수, 아무것도 통일 때문에 두 번째 경우는, 나쁜 생각 네가 원해. var/1ground/1을 사용하여 변수를 확인할 수 있지만 그 시점에서 Prolog의 검색을 변경하면 더욱 복잡해질 것입니다. 따라서 공백 변수는 SQL에서 NULL과 같지 않을 수 있습니다. 요약

:

  • 강제 경우
  • , 특별한 값이에 대한
+0

많은 도움이됩니다. 감사! – AxGryndr

+0

@AxGryndr 문제 없습니다, 질문 해 주셔서 감사합니다! –