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).