Saltar al contenido

¿Cómo ejecutar SWI-Prolog desde la línea de comandos?

Posterior a consultar con especialistas en este tema, programadores de deferentes ramas y maestros hemos dado con la respuesta al dilema y la plasmamos en esta publicación.

Solución:

Directiva ISO: inicialización. Esto debería funcionar.

:- initialization main.

main :-
  write('Hello Worldn').

editar lo siento, me salté los detalles más interesantes. Aquí hay un script de muestra, digamos guardado en ~/test/main.pl

#!/home/carlo/bin/swipl -f -q

:- initialization main.

main :-
  current_prolog_flag(argv, Argv),
  format('Hello World, argv:~wn', [Argv]),
  halt(0).

y hecho ejecutable con

chmod +x ~/test/main.pl

entonces obtengo

~$ ~/test/main.pl
Hello World, argv:[]

~$ ~/test/main.pl as,dnj asdl
Hello World, argv:[as,dnj,asdl]

en guión main.pl, utilicé la ruta swipl que resulta de compilar desde el origen sin privilegios de administrador. El proceso de compilación de SWI-Prolog colocó bin y lib en ~/bin y ~/lib

Nota: el indicador -f deshabilita la carga de la inicialización ~/.plrc, y esto podría ser necesario para obtener un “control más estricto” sobre la ejecución…

Actualmente no estoy seguro de si la página de documentación está actualizada con el estado SW actual. De algún mensaje de la lista de correo, y mis propios esfuerzos para reutilizar thea, parece que las banderas de la línea de comando cambiaron recientemente…

La otra respuesta es más o menos correcta, sin embargo, la forma en que funciona puede depender de su sistema operativo. La forma más portátil de hacerlo es, aparentemente:

$ cat example.pl
#!/path/to/your/swipl

:- set_prolog_flag(verbose, silent).

:- initialization main.

main :-
    format('Example script~n'),
    current_prolog_flag(argv, Argv),
    format('Called with ~q~n', [Argv]),
    halt.
main :-
    halt(1).

La diferencia aquí es que no hay nada en la línea shebang además de la ruta a swipl. Todo lo demás se hace usando directivas. en mi sistema operativo, solo eso funciono!

$ chmod u+x example.pl
$ example.pl foo bar baz
Example script
Called with [foo,bar,baz]

EDITAR

Probablemente sea más limpio eliminar la línea shebang por completo y, en su lugar, ejecutar desde la línea de comando:

$ swipl -s example.pl -- foo bar baz
Example script
Called with [foo,bar,baz]

Nuevamente, usando una directiva para establecer main/0 ya que el objetivo de inicialización le evita tener que hacer esto explícitamente en la línea de comando. Vocación swipl desde la línea de comandos, por otro lado, le permite a su sistema operativo encontrar dónde está el ejecutable, en lugar de codificar esta información en el script.

Puedes usar initialization/2.

#!/path/to/swipl -q

:- initialization(main, program).

main :-
    write("Hello"), nl,
    halt.

Razón fundamental:

  • -q (--quiet) se utiliza para suprimir todos los mensajes informativos, incluidos los mensajes informativos que se originan en el archivo de inicialización de SWI-Prolog (~/.swiplrc). :- set_prolog_flag(verbose, silent). podría usarse en su lugar, pero no suprime los mensajes informativos que provienen del archivo de inicialización.

  • :- initialization(main, program).program hace que Prolog salga con un código de error al fallar main o al encontrar una excepción, en lugar de permanecer en el REPL.

  • halt – Detiene el programa con código de salida 0.

Lo anterior asume que desea cargar el archivo de inicialización (~/.swipl) antes de ejecutar el programa. Si no desea cargar el archivo de inicialización, utilice #!/path/to/swipl -f -q como el shebang. Esto hace que el script se inicie más rápido.

(Además, asegúrese de configurar el bit ejecutable (chmod +x hello.pl) antes de ejecutar el script (./hello.pl))

Sección de Reseñas y Valoraciones

Si para ti ha sido provechoso este post, agradeceríamos que lo compartas con más seniors de esta forma nos ayudas a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *