swi portable mac instalar for down descargar descarga buho prolog iso-prolog xsb meta-predicate

portable - Términos de Hilog en(XSB) Prolog



swi prolog down (1)

Dentro de XSB, los términos de Hilog están muy fuertemente conectados al sistema modular que es exclusivo de XSB. XSB tiene un sistema de módulos basado en el functor. Es decir, dentro del mismo alcance, la length(X) podría pertenecer a un módulo, mientras que la length(L, N) podría pertenecer a otro. Como consecuencia, la call(length(L), N) podría referirse a un módulo y call(length(L, N)) a otro:

[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];

Es posible que en ese contexto haya diferencias entre los términos call/N y Hilog. Sin embargo, hasta ahora no he encontrado ninguno.

Históricamente, los términos de Hilog se han introducido 1987-1989. En ese momento, call/N ya existía como built-in en NU y como library(call) en Quintus Prolog con solo documentación superficial . Ha sido propuesto en 1984 por Richard O''Keefe . Por otro lado, call/N era claramente desconocido para los autores de Hilog, como se ejemplifica en la p.1101 de Weidong Chen, Michael Kifer, David Scott Warren: HiLog: una semántica de primer orden para construcciones de programación lógica de orden superior. NACLP 1989. 1090-1114. MIT-Press.

... El cierre transitivo genérico también se puede definir en Prolog:

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

Sin embargo, esto es obviamente poco elegante en comparación con HiLog (ver Sección 2.1), ya que esto implica tanto construir un término de una lista como reflejar este término en una fórmula atómica usando "llamada". El objetivo de este ejemplo es que la falta de fundamentos teóricos para las construcciones de orden superior en Prolog dio como resultado una sintaxis oscura, lo que explica parcialmente por qué los programas Prolog que implican tales construcciones son muy difíciles de entender.

Ahora, esto se puede hacer con call/N así que:

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

Que es incluso más general que la versión (=..)/2 porque R ya no está restringido a ser un átomo. Como comentario aparte, prefiero escribir:

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

¿Los términos de Hilog (es decir, compuestos que tienen como funtores términos arbitrarios) todavía se consideran una característica poderosa en XSB Prolog (o en cualquier otro Prolog)? ¿Hay muchos proyectos XSB que usen esta característica actualmente? ¿Cuál de ellos por ejemplo?

Lo pregunto ya que, por lo que entiendo, la programación de orden superior también es posible utilizando la llamada / N incorporada de ISO.

Específicamente, me gustaría entender si XSB está utilizando términos de Hilog solo por razones históricas o si los términos de Hilog tienen ventajas considerables en comparación con el estándar ISO actual.