1

そのため、今週は Prolog の拡張機能の 1 つである Logtalk をインストールしました。この場合、私は Prolog SWI を使用していますが、少し問題が発生しました。Logtalk を使用して自分のプロジェクトを実際に参照する方法がわかりません。コード自体を理解するために Logtalk に付属のサンプルを調べたところ、それらを読み込んで完全に実行することができました。私が理解していないのは、logtalk がファイルをロードしているときに実際に何が起こっているのか、そして自分のプロジェクトをどのようにロードできるのかということです。

議論のポイントとして、「hello_world」の例を取り上げます。hello_world というファイルは、Logtalk ファイルのサンプル フォルダーにあります。それでも、次のように相談されます。

| ?- logtalk_load(hello_world(loader)).

私が最初に思ったのは、「それはファンクターだ」ということでした。トレースを使用して何をしているのかを調べたところ、ライブラリから呼び出されていて、examples フォルダーに移動する方法を教えられていることがわかり、そこで「hello_world」を開いた" フォルダ、次に "loader" ファイル。その後、通常のコンパイルが行われました。

ライブラリを見てみましたが、何が起こっているのかわかりませんでした。また、これは、ユーザーが作成したプロジェクトを Logtalk にロードするための実用的な方法ではないだろうとも考えました。SWI でこれを行う方法を尋ねる別の投稿もありましたが、返信がなく、問題を解決するための努力がなされたようには見えませんでした。

ここではっきりさせておきますが、「consult('...')」を使用できます。「consult」を使用してプロジェクトを開くこともできますが、これを行うと、logtalk コンソールは logtalk 拡張機能を使用していないようで、単なるバニラ プロローグです。私は Windows 用のインストーラーを使用して logtalk をインストールしました。

チュートリアルを見つけようとしましたが、Logtalk に関するものを見つけるのは非常に困難です。私が見つけたのは、プロジェクト内からのロードに関する次のドキュメントです。

logtalk_load/1.
logtalk_load/2.

私は次のように理解しています:

logtalk_load(file). % Top level loading
logtalk_load(folder(file). % Bottom level loading

そのため、プロジェクトの他のコンポーネントをロードするローダー ファイルを作成するたびに膨大な手動ロードを節約する必要があります (これは、Logtalk の例で行われていることです)。このビットは私にとっては理にかなっていると思いますが、ローダーファイルに到達する方法はそうではありません。

正しく理解できているかどうかはまだわかりませんが、正しく理解できていても、自分のプロジェクトをどのようにロードするかについてはまだ迷っています。私が例から非常に迅速に学ぶので、最善の例を挙げることができれば、あなたが与えることができるどんな助けにも感謝します.

少し更新

プログラムの実行に logtalk コンソールを使用しているかどうか尋ねられましたが、「QUICK_START」ファイル [Start > Programs > Logtalk > "Logtalk - Prolog-SWI ( console)"] logtalk アドオンが機能しているかどうか再確認することを考え、「鳥」の例をテストしました。これは、オブジェクトを使用しており、よく知られている例だからです。繰り返しになりますが、logtalk_load/2 ファンクターを使用すると、すべてが正常に機能します。

これまでに寄せられたフィードバックを踏まえて、ライブラリ パスが参照しているものをもう少し調べてみました。logtalk がファイルをロードする方法を調べています。logtalk は libpaths と呼ばれるプロローグ ファイルを含むフォルダーを調べます。これは基本的に例を見つける方法であり、ファイルをどこから取得するかについての途中の説明です。したがって、少なくとも「logtalk_load/2」と言うと、このファイルに移動して、求めているフォルダーの場所を見つけます。

自分のプロジェクト フォルダーを既にサンプル フォルダーに配置しているので、すぐに自分のフォルダーをリストに追加して、これが少なくとも部分的な解決策になるかどうかをテストして、物事をもう少し理解するのに役立ちます。以下を libpaths.pl ファイルに追加しました。

logtalk_library_path(my_project, examples('my_project/')).
% The path must end in a / so I have done so

これで、フォルダー パスが宣言され、フォルダーが取得されました。ローダー ファイルは、ローダーを使用するときに呼び出すものです。独自の lib パス フォルダーを設定することを考えなくても、作業を開始して実用的な学習を行うのに十分な量が必要です。残念ながら、私の調査は失敗したようで、次のものが返されました。

ERROR: Unhandled exception: existence_error(library,project_aim)

私が見たいと思っていたものではありませんが、私はこのライブラリ エラー ビジネスに戻ります。プロジェクトフォルダーへの参照がどこかにありませんが、他に参照が必要な場所がわかりません。この問題でトレースを実行しても、次のことが発生しただけで役に立ちませんでした。

Call: (17) logtalk_library_path(my_project, _G943) ? creep
Fail: (17) logtalk_library_path(my_project, _G943) ? creep
ERROR: Unhandled exception: existence_error(library,my_project)

呼び出しが失敗しています。logtalk が探している場所に参照が見つかりません。この種の問題に関しては、私はせいぜい初心者です。現在、コンピューターを使用してから 3 年しか経っていません。過去 2 年間、ビジュアル スタジオで C# と C++ を使用してプログラミングを行っています。少なくとも私はこの問題にもう少し光を当てましたが、この情報を基にさらに役立つアドバイスはありますか?

4

2 に答える 2

2

私の答えが不確かなのは、あなたが通常のconsult作品を主張しているが、そうではないということですlogtalk_load. Logtalk にアクセスするには、Prolog とは別のプログラムを実行する必要があります。swilgtUnix では、SWI-Prolog やgplgtGNU Prologのようなものです。私は Windows を持っていないので、単に Prolog ではなく Logtalk という名前のバイナリを実行していることを確認する以外に、Windows で何をする必要があるかを実際に伝えることはできません。

それ以外の場合、基本的な問題は、Windows では作業ディレクトリを制御するのが難しいことだと思います。Unix 環境では、端末をファイルのあるディレクトリに移動し、そこから Logtalk または Prolog を起動します。次に、ファイルに名前を付けると、それらは現在のディレクトリにあるため、Prolog は問題なくそれらを見つけることができます。コマンド ラインの Prolog を実行している場合は、おそらくメニュー項目を構成して、これを行うようにすることができますが、送信先を知っておく必要があります。

ファンクター表記を使用して、サブディレクトリを取得できます(たとえば、foo(bar(baz(bat(afile))))finds foo\bar\baz\bat\afile.lgt)。これはあなたが理解しているようで、少なくとも私はそれを裏付けることができます. これは、事前定義されたファンクターのリストと、現在のディレクトリも検索します。しかし、どこからでも Logtalk を起動して実行することができます。その後、assertz(logtalk_library_path(foo, 'C:\foo\bar\baz\bat')).C logtalk_load(foo(afile)):\foo\bar\baz\bat\afile.lgt に展開されます。

その手法に基づいて、ファイルを Logtalk ユーザー ディレクトリに配置$LOGTALKUSER し、ドキュメントに示されているように使用できます。Logtalk ユーザー ディレクトリが Windows でどこにあるのかについての明確な参照は見つかりませんが、ユーザーの Documents and Settings フォルダにあると思います。したがって、このように新しい logtalk_library_path を定義することで、そこに何かを入れて参照することができます。

それは素晴らしいことですが、起動するたびにこれらのアサーションを何度も入力しなければならない場合は、依然として気が重くなります。幸いなことに、settings.lgtLogtalk ユーザー ディレクトリに Logtalk 設定ファイルという名前があり、上部にコメント アウトされたコードのチャンクがあります。

%  To define a "library" path for your projects, edit and uncomment the
%  following lines (the library path must end with a slash character):

/*
:- multifile(logtalk_library_path/2).
:- dynamic(logtalk_library_path/2).

logtalk_library_path(my_project, '$HOME/my_project/').
logtalk_library_path(my_project_examples, my_project('examples/')).
*/

これらの行のコメントを外して独自のものを挿入するだけで、永続的なショートカットを取得できます。

SWI Prolog 用のファイルを作成してplrc、起動時に発生する他のことを定義することもできます。もう 1 つのオプションは、Logtalk 固有であるためよりクリーンに見えますが、a のplrc方が一般的です。

その仕組みが整ったら、ローダー ファイルがあるとさらに便利になります。

: このようなことをテストする Windows を持っていないため、上記の変更のいずれかまたは両方を行う必要がある場合があります。

  • /パスの代わりに使用する必要がある場合があり\ます (または、どちらかが機能する可能性があります)。それが/他のすべてのシステムの仕組みだからです。
  • Logtalk が変数を展開する方法によっては、%LOGTALKUSER%代わりにを使用する必要がある場合があります。$LOGTALKUSER

これがお役に立てば幸いです。Logtalk を使い続けていただければ幸いです。あなたのような熱心なユーザーが利用できる可能性があります。

于 2013-03-30T05:58:29.410 に答える
2

今後のヘルプについては、公式の Logtalk サポート チャネルを使用してください。タイムリーな返信が届きます。Daniel さん、このユーザーを助けてくれてありがとう。

Logtalk 2.x を使用していると思います。Logtalk 3.x は、相対および完全なソース ファイル パスをサポートすることに注意してください。Logtalk 2.x では、logtalk_compile/1-2(コンパイルしてディスクに) およびlogtalk_load/1-2(コンパイルしてメモリにロードする) 述語は、ソース ファイルの名前 (.lgt拡張子なし) または "ライブラリ表記法" を使用してロードされるソース ファイルの場所のいずれかを取ります。前者を使用するには、最初に現在の作業ディレクトリをファイルを含むディレクトリに変更する必要があります。これにより、2 番目のオプションがより柔軟になります。あなたが言及したようにhello_world、あなたが引用した例は、次のように入力してロードできます。

?- logtalk_load(hello_world(loader)).

また:

?- {hello_world(loader)}.

consult/1Logtalk 2.x および 3.x は、make/0edit/0-1、 、グラフィカル トレーサー、グラフィカル プロファイラーなどの SWI-Prolog 機能との統合も提供します。例えば:

?- [hello_world(loader)].

********** Hello World! **********
% [ /Users/pmoura/logtalk/examples/hello_world/hello_world.lgt loaded ]
% [ /Users/pmoura/logtalk/examples/hello_world/loader.lgt loaded ]
% (0 warnings)
true.

独自のサンプルとプロジェクトをロードするには、Daniel が説明したように、$LOGTALKUSER/settings.lgtファイル ( Windows の場合)を保持するディレクトリにライブラリ パスを追加するのが最も簡単な方法です。%LOGTALKUSER%\settings.lgtLogtalk ユーザー ディレクトリの場所は、提供されたインストーラーを使用するときに定義されます。デフォルトはMy Documents\LogtalkWindows です。libpaths.plファイルを編集することはお勧めできません。ファイルを優先的に使用しsettings.lgtて、独自のライブラリ パスを定義します。あなたの場合のように、%LOGTALKUSER%\examples\project_aimディレクトリを作成したと仮定して、次の行を%LOGTALKUSER%\settings.lgtファイルに追加します。

:- multifile(logtalk_library_path/2).
:- dynamic(logtalk_library_path/2).

logtalk_library_path(project_aim, examples('project_aim/').

ファイルがある場合は、次の%LOGTALKUSER%\examples\project_aim\loader.lgtように入力してロードできます。

?- {project_aim(loader)}.

お役に立てれば。

于 2013-04-01T14:01:15.687 に答える