5

問題に4時間苦労した後、あなたの助けをいただければ幸いです。

プロローグスクリプトから(Windows上で)exeファイルを作成する必要があります。たとえば、main.plには次のものがあります。

day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).    % let's stop here

このスクリプトをコンパイルし、prog.exeファイルを作成してから、次の実行を実行できるようにします。

$ prog.exe --term sunday
 false
$ prog.exe --term monday
 true
$ prog.exe --goal day(friday)
 true
$ prog.exe --goal fun(foo)
 false

フラグが難しい場合は、入力目標のある非フラグバージョンも非常に役立ちます。

swi-prologページのコンパイルページを読み込もうとしましたが、混乱しました。標準出力ストリームに何も印刷できません。また、フラグがどのように機能するのか理解できませんでした。

彼らがswi-prologサイトに持っている例を試しましたが、何も印刷されない理由がわかりません。以下のスクリプトを使用すると、コマンドsave(prog)を使用してexeファイルを作成できますが、prog.exeを実行している間は何も出力されません。

:- ['main'].

main :-
        pce_main_loop(main).

main(Argv) :-
        write('hello word').

save(Exe) :-
        pce_autoload_all,
        pce_autoload_all,
        qsave_program(Exe,
                      [ emulator(swi('bin/xpce-stub.exe')),
                        stand_alone(true),
                        goal(main)
                      ]).
4

2 に答える 2

5

SWI-Prologには、optparseコマンドライン引数の解析に使用できるライブラリが含まれています。

opts_spec(
    [ [opt(day), type(atom),
        shortflags([d]), longflags(['term', 'day']),
        help('name of day')]

    , [opt(goal),
        shortflags([g]), longflags([goal]),
        help('goal to be called')]
    ]
).

% days
day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).


main :-
    opts_spec(OptsSpec),
    opt_arguments(OptsSpec, Opts, _PositionalArgs),
    writeln(Opts),
    memberchk(day(Day), Opts),
    memberchk(goal(Goal), Opts),
    (nonvar(Day) -> call_call(day(Day), Result), writeln(Result) ; true),
    (nonvar(Goal) -> call_call(Goal, Result), writeln(Result) ; true),
    halt.

call_call(Goal, true) :-
    call(Goal), !.

call_call(_Goal, false).

上記のコードをこのようにコンパイルして使用できます。(Ubuntuでのみテストされています。申し訳ありませんが、Windowsに関しては仕方がありません。)

$ swipl -o day.exe -g main -c day.pl

$ ./day.exe --term monday
[goal(_G997),day(monday)]
true

$ ./day.exe --goal "day(sunday)"
[day(_G1009),goal(day(sunday))]
false
于 2013-02-13T13:24:37.523 に答える
4

テストケースとして別の回答のために投稿したモジュールであるeight_puzzle.plを参照します。次に、テスト引数の行の使用法を含む新しいファイル(p8.plなど)を作成し、コンパイルして実行します

:- use_module(eight_puzzle).

go :-
    current_prolog_flag(argv, Argv),
    writeln(argv:Argv),
    (   nth1(Test_id_flag, Argv, '--test_id'),
        Test_id_pos is Test_id_flag+1,
        nth1(Test_id_pos, Argv, Id)
    ->  atom_concat(test, Id, Func)
    ;   Func = test1
    ),
    forall(time(call(eight_puzzle:Func, R)), writeln(R)).

コンパイルするには、 2.10コンパイルのドキュメントセクション2.10.2.4を使用しました

swipl -O --goal=go --stand_alone=true -o p8 -c p8.pl

指定されたオプションで実行するには:

./p8 --test_id 0

私はUbuntuを実行していますが、Windowsで違いはないはずです。

argv:[./p8,--test_id,0]
% 4,757 inferences, 0.003 CPU in 0.003 seconds (100% CPU, 1865842 Lips)
[4,3,6,7,8]
% 9,970 inferences, 0.005 CPU in 0.005 seconds (100% CPU, 2065656 Lips)
[4,3,6,7,4,5,8,7,4,5,8,7,4,5,8]
...

HTH

于 2013-02-08T10:09:44.537 に答える