2013-03-18 3 views
7

XSB 프롤로그 (또는 다른 프롤로그)에서 여전히 강력한 특성으로 간주되는 Hilog 용어 (즉, 임의의 용어로 펑터를 갖는 화합물)는 있습니까? 현재이 기능을 사용하는 XSB 프로젝트가 많이 있습니까? 예를 들면 어떤 것인가?(XSB) 프롤로그의 히 로그 용어

나는 ISO 프로그래밍 내장 호출/N을 사용하여 상위 프로그래밍이 똑같이 가능하다는 것을 알고 있기 때문에 질문합니다.

특히 XSB가 역사적인 이유로 Hilog 용어를 사용하고 있는지 또는 Hilog 용어가 현재 ISO 표준과 비교할 때 상당한 장점이 있는지 알고 싶습니다.

답변

5

XSB에서 Hilog 용어는 XSB에 고유 한 모듈 시스템에 매우 강하게 연결되어 있습니다. XSB에는 Functor 기반 모듈 시스템이 있습니다. 즉, 동일한 범위 내에서 length(X)은 하나의 모듈에 속할 수 있지만 length(L, N)은 다른 모듈에 속할 수 있습니다. 결과적으로, call(length(L), N) 다른 하나 개의 모듈과 call(length(L, N))를 참조 수 있습니다

[Patch date: 2013/02/20 06:17:59] 
| ?- use_module(basics,length/2). 
yes 
| ?- length(Xs,2).    
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
Xs = [_h217,_h219] 
yes 
| ?- use_module(inex,length/1). 
yes 
| ?- length(Xs,2). 
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
++Error[XSB/Runtime/P]: [Existence (No module inex exists)] in arg 1 of predicate load 
| ?- call(call(length,Xs),2). 
Xs = [_h228,_h230]; 

이 같은 맥락에서 call/N와 Hilog 용어의 차이가 있음을 수 있습니다. 그러나 나는 지금까지 하나를 발견하지 못했습니다.

역사적으로 힐로그 용어는 1987-1989 년에 소개되었습니다. 그 시점에서 call/N은 이미 NU에 내장되어 있고 only cursory documentation 인 Quintus Prolog에서 library(call)으로 존재했습니다. 1984 by Richard O'Keefe이 제안되었습니다. 한편, call/N은 Weilong Chen, Michael Kifer, David Scott Warren : HiLog : A Higher-Order Logic Programming Constant의 의미에 대한 예문과 마찬가지로 Hilog의 저자에게는 명확하게 알려지지 않았습니다. NACLP 1989. 1090-1114. MIT-Press.

... 일반 전이 폐쇄는 프롤로그에서 정의 할 수 있습니다 :

closure(R, X, Y) :- C =.. [R, X, Y], call(C). 
    closure(R, X, Y) :- C =.. [R, X, Z], call(C), closure(R, Z, Y). 

그러나,이 HiLog (2.1 절 참조)에 비해 분명히 우아하다,이 모두에서 용어를 건설 포함하기 때문에 목록을 작성하고이 용어를 "호출"을 사용하여 원자 공식으로 반영합니다. 이 예제의 요점은 Prolog에서 고차원 구문에 대한 이론적 토대가 없기 때문에 모호한 구문으로 이어졌으며 이러한 구문을 포함하는 Prolog 프로그램이 왜 이해하기 어렵게되었는지를 부분적으로 설명합니다.

는 이제,이과 같이 call/N으로 수행 할 수 없습니다 : 더 일반적인 R 때문에 (=..)/2 -version보다

closure(R, X, Y) :- call(R, X, Y). 
closure(R, X, Y) :- call(R, X, Z), closure(R, Z, Y). 

가 더 이상 원자 인으로 제한됩니다. 제쳐두고, 나는 다음과 같이 쓰는 것을 선호한다.

closure(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X). 

closure0(_R_2, X,X). 
closure0(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X).