2016-08-23 11 views
2

Answer Set Programming (ASP)에서 예제 문제가 있습니다. Prolog에서 동등한 코드를 만들려고 할 때 나는 계속 not을 막았습니다.Prolog - 'not'to Prolog to negate

이것은 ASP 코드는 다음과 같습니다

road(berlin,potsdam). 
road(potsdam,werder). 
road(werder,brandenburg). 
road(X,Y) :- road(Y,X). 

blocked(werder,brandenburg). 

route(X,Y) :- road(X,Y), not blocked(X,Y). 
route(X,Y) :- route(X,Z), route(Z,Y). 

drive(X) :- route(berlin,X). 

#show drive/1 

대답은 : drive(potsdam), drive(werder), drive(berlin).

프롤로그에서 처음에는 not\+으로 변경하는 것처럼 간단 할 것이라고 생각했습니다. drive(X).을 쿼리하면 회귀 적으로 X = potsdam 답이 생성됩니다. 나는 Prolog와 ASP가 다르게 작동한다는 것을 알고 있지만, 나는 그것을 이해할 수 없다.

road(X,X). 

와 함께

road(X,Y) :- road(Y,X). 

: 당신은 술어를 대체 할 수

is road(X,Y)? 
is road(Y,X)? 
is road(X,Y)? 
is road(Y,X)? 
..... 

:

답변

2

문제는 사실 사이의 일치가없는 경우이 영원히 재귀 적 road(X,Y) :- road(Y,X).입니다 추가 :

reachable(X,Y):- 
    road(X,Y) 
    ; road(Y,X). 

수정 :

route(X,Y) :- road(X,Y), \+ blocked(X,Y). 

에 :

route(X,Y) :- reachable(X,Y), \+ blocked(X,Y). 
+1

당신이 도로 (베르, 도시)을 추가합니다. 그것이 결과로 도시로 제공하지 않습니다. – coder

+0

귀하의 권리, 업데이 트에 빨리했다. 이전 버전은 여전히 ​​작동하지만 중복 답변을 제공합니다. – Limmen