web-dev-qa-db-ja.com

コマンドラインからSWI-Prologを実行する方法は?

次のようにhello.plというプロローグスクリプトを作成する方法はありますか?

#!/usr/local/bin/swipl -q -s -t main

main:-
  write('Hello World\n').

そして、このように端末から実行できますか?

$ hello.pl
Hello World
$

私がそれをするとき、それは私にこれを与えます:

hello.pl: line 3: main:-: command not found
hello.pl: line 4: syntax error near unexpected token `'Hello World\n''
hello.pl: line 4: `  write('Hello World\n').'

コマンドラインでこれを書くことでそれを機能させることができます:

$ swipl -q -f hello.pl -t main
Hello World
$

しかし、代わりにストレートスクリプトを実行可能ファイルとして実行する方法はありますか?

編集

これを機能させることはまだできていません。 @Borisが彼の回答のコメントで尋ねたコマンドからの出力は次のとおりです。

$ ls -l
total 8
-rwxr-xr-x  1 viatropos  staff  235 Aug 26 20:28 example.pl
$ cat example.pl
#!/usr/local/bin/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).
$ which swipl
/usr/local/bin/swipl
$ swipl --version
SWI-Prolog version 6.6.6 for x86_64-darwin13.1.0
$ ./example.pl
./example.pl: line 3: syntax error near unexpected token `('
./example.pl: line 3: `:- set_prolog_flag(verbose, silent).'
$

私はMacOSX 10.9.2を使用しており、brew install swi-prolog --with-libarchiveを介して自作でswiplをインストールしました

15
Lance Pollard

ISOディレクティブ: 初期化 。これはうまくいくはずです。

:- initialization main.

main :-
  write('Hello World\n').

edit申し訳ありませんが、最も興味深い詳細をスキップしました。これがサンプルスクリプトです。たとえば、〜/ test /main.plに保存されています。

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

:- initialization main.

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

で実行可能になりました

chmod +x ~/test/main.pl

それから私は得る

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

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

スクリプト内main.pl、管理者権限なしでソースからビルドした結果のswiplパスを使用しました。 SWI-Prologビルドプロセスは、binとlibを〜/ binと〜/ libの下に置きます

注:-fフラグは、初期化〜/ .plrcのロードを無効にします。これは、実行をより「厳密に制御」するために必要になる場合があります。

現在、ドキュメントページが最新のSWステータスであるかどうかはわかりません。 いくつかのメーリングリストメッセージ から、そして私自身の再利用の努力 thea から、コマンドラインフラグが最近変更されたようです...

11
CapelliC

他の答えは多かれ少なかれ正しいです、しかし、それがどのように機能するかはあなたのOSに依存するかもしれません。それを行うための最もポータブルな方法は、明らかに次のとおりです。

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

ここでの違いは、swiplへのパス以外にShebangラインには何もないということです。それ以外はすべてディレクティブを使用して行われます。私のOSではそれだけが機能しました

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

編集

Shebang行を完全に削除し、代わりにコマンドラインから実行する方がおそらくクリーンです。

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

繰り返しになりますが、ディレクティブを使用してmain/0を初期化の目標として設定すると、コマンドラインでこれを明示的に行う必要がなくなります。一方、コマンドラインからswiplを呼び出すと、スクリプトにこの情報をハードコーディングする代わりに、OSが実行可能ファイルの場所を見つけることができます。

5
user1812457

_initialization/2_を使用できます。

_#!/path/to/swipl -q

:- initialization(main, program).

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

理論的根拠:

  • _-q_(_--quiet_)は、SWI-Prolog初期化ファイル(_~/.swiplrc_)から発信された情報メッセージを含むすべての情報メッセージを抑制するために使用されます。 :- set_prolog_flag(verbose, silent). 代わりに使用できますが、初期化ファイルからの情報メッセージは抑制されません。

  • :- initialization(main, program). --programは、REPLに留まるのではなく、mainの失敗時または例外の発生時に、Prologをエラーコードで終了させます。

  • halt-終了コード0でプログラムを停止します。

上記は、プログラムを実行する前に初期化ファイル(_~/.swipl_)をロードすることを前提としています。初期化ファイルをロードしたくない場合は、_#!/path/to/swipl -f -q_をShebangとして使用します。これにより、スクリプトの起動が速くなります。

(また、スクリプト(_chmod +x hello.pl_)を実行する前に、必ず実行可能ビット(_./hello.pl_)を設定してください)

1
Flux