2017-10-17 1 views
1

내가 정의 내 지식 기반과 같이 프롤로그 잘라 운영자

?- swim(simba,bybirth). 
?- swim(simba,mustlearn). 

그리고 쿼리 모두

는 프롤로그가 true를 돌려 : 이제

edge(mammal,isa,animal). 
edge(human,isa,mammal). 
edge(simba,isa,human). 

edge(animal,swim,bybirth). 
edge(human,swim,mustlearn). 

path(X,Y) :- edge(X,isa,Y). 
path(X,Y) :- edge(X,isa,Z), path(Z,Y). 

swim(X,Y) :- edge(X,swim,Y). 
swim(X,Y) :- path(X,Z), swim(Z,Y). 

, 위의 지식 기반을 사용하여, 나는 다음과 같은 사용 . 프로 롤 (Prolog)이 부동산 수영을 로컬에서 먼저 확인한 다음 직접 상위를 살펴보고 계층 적 방식으로 살펴 보겠습니다. 그리고 우리는 Simba가 수영 할 수있는 "mustlearn"이라는 것을 알게되고 더 이상 보지 말아야합니다. 따라서 첫 번째 쿼리에서는 false를 반환하고 두 번째 쿼리에서는 true를 반환해야합니다.

역 추적을 제한하여 수행해야한다는 것을 알고 있습니다. 나는 컷을 사용하고 연산자를 사용하지는 않았지만 성공하지 못했습니다. 이것을 달성 할 수있는 방법이 있습니까?

답변

1

시도해 보니 문제가 발생했습니다. 그것은 작동하지 않습니다

swim(X,Y) :- once((edge(X,swim,Y); path(X,Z), swim(Z,Y))). 

, Y 이미있는 길을 인스턴스화하는 경우, 첫 번째 단계는 통합에 실패하고 그 중간체 human 통과하는 두 번째 경로를 시도하기 때문에 :이 작동하지 않을 수 있습니다 생각했다. 따라서 쿼리가 하나의 결과 만 생성하더라도 swim(simba, bybirth)을 속일 수 있습니다. 이 솔루션은 프롤로그가 다른 변수에 바인딩에 투입하고 투입 한 후 바인딩을 확인하기 위해 강제하는 것입니다 :이 프롤로그를 알려줍니다

swim(X,Y) :- 
    once((edge(X,swim,Method); path(X,Z), swim(Z,Method))), 
    Method = Y. 

,이 방법에 도착하는 하나의 방법이있다, 그래서 방법을 찾아, 그런 다음 Y이어야합니다. 잘못된 방법을 찾으면 검색을 수행하지 않고 그냥 실패합니다. 시도 해봐!