2011-10-24 10 views
2

SWI-プロローグ私は、このプロローグプログラムを入力した5.10.2/0未定義手順はセーブ/ 1

。私はオプションAを実行したときしかし、私は次のエラーを取りに行きます。

go/0 Undefined Procedure save/1 

保存は適切なキーワード述語であり、ファイルへのパスも存在すると確信しています。私がどこに間違っているのか分かりません。

What does the /0 /1 mean in go and save? 

ソースコード

/* Shopping list */ 

go:-reconsult('~/projects/prolog/chap7/shopping.pl'), 
    write('a: See list'), nl, 
    write('b: Add to list'), nl, 
    write('c: Delete from list'), nl, 
    read(Choice), 
    choice(Choice), 
    save('~/projects/prolog/chap7/shopping.pl'). 

/* 
    facts for shopping 
*/ 
item(potatoes). 
item(bread). 
item(coffee). 

/* 
    Rules for shopping list 
*/ 
choice(a):-listing(item), nl. 
choice(b):-write('Enter an item: '), 
     read(Item), 
     assert(item(Item)). 
choice(c):-write('Item to delete: '), 
     read(Item), 
     retract(item(Item)). 
choice(_):-write('Incorrect entry.'), nl. 

事前に多くのおかげで、なぜあなたは私がSWI Prologのに非常に精通していないよ以来、エラーを取得しますが、/ 1だ

答えて

6

エラーメッセージには、定義した述語go/0は、システムが未定義のプロシージャとして認識してラベル付けしない述語save/1を使用すると記載されています。述語は、通常名前が原子として表され、述語の名前で、アリティは述語が受け入れ定義されているどのように多くのパラメータを表す数である形態name/arity述語インジケータにより識別されます。これは、例えば、 go/0は、あなたのプログラムで定義されていないパラメータを持つ述語go、識別子です。 save/1は、呼び出すしようとしているのにシステムが見つけることができない1つのパラメータを持つ述語saveの識別子です。述語が2つ以上のオーバーロードされたバージョンを介して定義されている場合、例えば、各定義について異なるアリティを有する場合、各アリティを角括弧で囲み、コンマで区切って参照することができる。 p/[1,2]。述語はプロシージャと呼ばれることもあり、この2つの用語はほぼ同等です。

older SWI-Prolog manuals(リンクはバージョン2.9を参照してください)に示すように、実際には標準ライブラリで定義され、一般にこれらのシステムで利用可能でした。これらの古いシステムでも、save/1の代わりにsave_program/[1,2]を使用して新しいプログラムを作成することが推奨されていましたが、これはデバッグの目的でのみ利用されていました。しかし、現代のSWI-Prologのシステム、またsave/1どちらもsave_program/[1,2]でご利用いただけます。 save/1の同等の述語は存在しないように見えますが、save_program/[1,2]の役割はqsave_program/[1,2]によって行われました。これは約in the latest version of the manualです。あなたはここに掲載の簡単なスニペットを超えて、あなたのプログラムの方法を拡張したいと思います念のために、また、約its limitationsを必ずお読みください。

この種の手順を一度も使用したことがないので、自分が何をしているかを知っておく必要があります。しかし、reconsult/1コールには、最初にsave/1で保存された同じファイルを使用する呼び出しがあることに気付きましたが、テキストファイル内に多数のProlog述語があること、つまりreconsult/1が読むことができることに気づくことを願います理解して、少なくともqsave_program(しかし私はsavesave_programも維持している)ハーフテキストハーフバイナリフォーマットは、ディスク上にプログラムを書き込むために使用します。あなたのコードを読むことで、買い物リストのアイテムを保存することに興味があるようです。私は、参考資料としてlisting/1I/O proceduresのような組み合わせを使用してプレーンテキストファイルに保存することができますopen/3,set_output/1,current_output/1などが挙げられる。

+0

プロローグ帳は古くなってそのため、おそらく1994年に出版されました。答えをありがとう。 – ant2009

+0

ちょうど好奇心が強い:どの本ですか? –

2

わかりません/ 0は、述部の引数の数を意味します。この場合、1つの引数、つまりsave/1でsaveを呼び出しています。

はまた、あなたが述語save_program/1を使用してみましたか?私が知る限り、保存はデバッグにのみ使用するべきです(http://euclid.barry.edu/~segami/Manual/sec-2.9.htmlから)。私が見た例で

は、セーブ/ save_program述語は常に引用符やファイルの拡張子なしで呼ばれていました。私は言語があなたのためにその部分を処理したという印象を受けました。 Like:save( 'filename.pl')の代わりにsave(filename)を使用します。

3

あなたは次のように書いています: "信頼できる、公式からの回答を探しています ソース"。あなたが最初の手のフィードバックを希望する場合は、SWIメーリングリストでご 質問を投稿する必要があります

SWI-Prolog 5.11.29, Mailing list

は通常あなたがループ内SWIプロローグの主著者でも 多くの貢献者を持っています。私が読んでいた

よろしく