2016-05-29 21 views
2

ソフトウェアを使用しようとしていますが、いくつか問題があります。Prologの文字列からリストへの変換

プロローグがプリインストールされている大学のコンピュータ(OSX)やWindowsコンピュータでは、同じソフトウェアが動作することに注意してください。それは私のLinux/Ubuntuマシンでは動作しませんが。

ソフトウェアは、このフォームを使用してbashスクリプトで起動:

echo "reset_statistics(off), specific_load_predicate(filename), tokenize(\"$2\", List), tex(List, $3)." | ./prolog-executable 

プロローグの実行ファイルがswipl -cqsave_program/1

を使用して作成された今、私は述語トークン化の形式は見つけました

tokenize([A|As], List) :- ... 

入力としてリストを取得しますが、bashスクリプトは文字列を提供します。

文字列からリストへの変換を自動的に行うプロローグモジュールまたは拡張機能を使用することは可能ですか?同じコードが他のコンピュータで動作するためです。

+1

SWI-Prologでは、Prologフラグ 'double_quotes'を' chars'(推奨)または 'codes'に設定して、二重引用符で囲まれたすべてを文字またはコードのリストに変換します。これは、最初に**あったはずであり、他のPrologシステムも何をするのかです。この点については、コマンドラインオプション '--traditional'を使用して標準に準拠した動作を得ることもできます。 – mat

+0

@mat素晴らしい!これは私が探していた答えのようなものでした。私が - swraを起動すると動作しますが、使用されているすべてのbashスクリプトで動作しません。システム全体に設定する方法はありますか? – Xeli

+1

Bashエイリアスを 'alias swipl = '/ usr/local/bin/swipl --traditional''などのように追加したり、'〜 - set_prolog_flag(double_quotes、chars) '。インストラクターが別の方法でSWI-Prologを呼び出すと、これはすべてとても楽しい状況につながります。 Prologの標準があるはずです。 – mat

答えて

2

SWI-Prologは、残念ながらはもはや文字 コードのリストであるダブル 引用符で囲まれているものという点で、PrologのISO  標準から逸脱していません。

次のいずれかの方法を使用し、この点で準拠の動作を復元するには:

  1. --traditionalフラグ
  2. とSWI-Prologのを呼び出すソースファイルに:- initialization(set_prolog_flag(double_quotes, codes)).を追加します。
  3. ~/.swiplrc初期化ファイルに:- set_prolog_flag(double_quotes, codes).を追加します。実際に

、代わりに文字コードのリストと一緒に行くの、私はあなたが完全に別のルートを取ると、各文字が 原子で表されることを意味し、文字のリストを使用するようにプログラムを適応させるお勧めします。これは、トップレベルの回答が依然としてクエリに表示される回答と非常によく似ており、実際には非常に読みやすいという大きな利点があります。

 
:- set_prolog_flag(double_quotes, chars). 

をご~/.swiplrc初期化ファイルに:あなたは置くことによって、例えば文字のリストを入手します。値文字を使用すると、たとえば取得:

 
?- Cs = "hello". 
Cs = [h, e, l, l, o]. 

私はあなたがこの値を使用し、文字のリストを操作するために、既存のプログラムを適応させるお勧めします。長期的には、これは歴史的に二重引用符がであったことを意味するを意味するこれは最もよく最も広く使用されたアプローチと思う。

ここで(戻る)まで、上記のいずれかの方法(例:、)SWI   7で導入された問題の周りに少なくとも仕事に、中間体溶液としてコードに切り替え、その後、コードで文字を動作するようにあなたのライブラリを適応させ、その後、最後に、文字に切り替えます。

関連する問題