2016-08-30 4 views
-2

내가 DrRacket이 프롤로그 코드를 실행하려고 작동하지 : 그러나 http://www.anselm.edu/homepage/mmalita/culpro/graf1.html데이터 로그 코드가 DrRacket

#lang datalog 

arc(a,b). 
arc(b,c). 
arc(a,c). 
arc(a,d). 
arc(b,e). 
arc(e,f). 
arc(b,f). 
arc(f,g). 

pathall(X,X,[]). 
pathall(X,Y,[X,Z|L]):- arc(X,Z),pathall(Z,Y,L).  % error on this line; 

pathall(a,g)? 

를, 그것은 다음과 같은 오류를주고있다 기호가 목록의 head-tail separator로 읽히지 않습니다. (이후의 라인이 제거 된 경우) 또한, []는 오류를주고있다 :

#%app: missing procedure expression; 
probably originally(), which is an illegal empty application in: (#%app) 

방법이이 수정 될 수 있도록하고 g 사이의 경로에 대한 코드 작품과 검색?

답변

2

DrRacket의 Datalog 모듈은 Prolog의 구현이 아니며 사용 된 구문은 허용되지 않습니다 (허용되는 구문은 manual 참조).

특히 용어는 목록 ([])과 같은 데이터 구조가 될 수 없습니다. 위와 같은 프로그램을 실행하려면 데이터 구조가있는 Prolog 인터프리터가 필요합니다. 경로가 같이 존재 여부를 물어, 예를 들어,

path(X,Y):- arc(X,Y). 
path(X,Y):- arc(X,Z),path(Z,Y). 

과 :

당신이 할 수있는 것은 당신이 연결 한 것을 예에서와 같이, 예를 들어 술어 path를 정의하다

path(a,g)? 

또는

path(X,g)? 

등으로 특정 노드에 대한 모든 경로를 인쇄

+0

위의 코드를 올바르게 작동하는 데이터 로그 코드로 어떻게 바꿀 수 있습니까? – rnso

+1

용어는 목록이 될 수 없기 때문에 그럴 수 없습니다. DrRacket의 Datalog Module은 Prolog와 동등하지 않은 매우 간단한 모듈이며 특히 데이터 구조를 구현하지 않습니다. 당신이 할 수있는 것은 링크 된 예제의 첫 번째 부분, 즉 경로가 존재하는지 여부를 테스트하거나 경로를 출력하는 것입니다. – Renzo

+0

라켓과 함께 적절한 프롤로그를 사용하는 방법이 있습니까? – rnso