2016-10-12 2 views
0

swi-prolog를 사용하고 있습니다. 나는 프로그램에서 다음 진술을 모델링하고 싶다. "a 또는 b는 범죄입니다 .b는 범죄가 아닙니다."프롤로그의 분리 된 삼단 논법

이러한 진술을 모델링 한 후. 다음 쿼리가 작동합니다.

?-c(X). 
X=a. 

하지만, 나는 프롤로그에서 문 위에 쓴 :

c(a);c(b). 
not(c(b)). 

이 코드를 컴파일하고 표시하지 않는 오류 :

No permission to modify static procedure `(;)/2' 

방법 프롤로그에서 두 문장 이상 모델에?

답변

0

afaik Prolog는 이러한 방식으로 작동하지 않습니다. 표현식을 모든 문장과 일치 시키려고 시도합니다. 당신이 싶은 모델 "는 범죄이며, b는 아니다"경우에 따라서, 당신은

criminal(a). 
not(criminal(b)). 

을 쓸 수 있지만, 당신이 말할 수없는 범죄 (b) 및 다음 줄의하지 (범죄 (B)) 이것은 모순으로 이어질 수 있기 때문입니다.

내 코드의 두 번째 줄 ('not (criminal (b))')은 실제로 중복됩니다. Prolog가 검색어의 일치 항목을 찾지 못하면 false가되고 다른 해결책으로 되돌아갑니다. 즉,이 경우 비 범죄자의 모든 사실을 간단하게 생략 할 수 있습니다.

당신은 다음 그냥 범죄자로 알고 원자들이 프롤로그를 요청할 수 있습니다 :

criminal(X). 

을하고 당신에게 명확 것이다 솔루션의 일부가 아닌 b를 반면

X=a.

.