2

swi-prolog 5.10.2

このプロローグプログラムを入力しました。しかし、オプションaを実行すると、次のエラーが発生します。

go/0 Undefined Procedure save/1

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

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.

よろしくお願いします。

4

3 に答える 3

5

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

古いSWI-Prologマニュアル(リンクはバージョン2.9を参照)で見ることができるように、save/1実際には標準ライブラリで定義されており、それらのシステムで一般的に利用可能です。これらの古いシステムでも、デバッグ目的でのみ悪用されると言われていた、save_program/[1,2]の代わりに新しいプログラムを作成するために使用することが提案されました。save/1ただし、最新のSWI-Prologシステムでは、save/1どちらsave_program/[1,2]も使用できません。に相当する述語はないようですがsave/1、の役割はsave_program/[1,2]によって引き継がれています。これについては、最新バージョンのマニュアルでqsave_program/[1,2]読むことができます。その制限についても必ずお読みください、ここに投稿した単純なスニペットを超えてプログラムを拡張したい場合に備えて。

そのような手順を使用したことがないので、私はあなたがあなたが何をしているのか知っていると仮定しなければなりません。ただし、後でreconsult/1保存した同じファイルを使用するプログラムの最初の呼び出しに気付いた場合、テキストファイル内の一連のProlog述語、つまり読み取りと理解が可能なsave/1形式には違いがあることに気付くようにお願いします。reconsult/1そして、少なくともqsave_program(しかし私も維持savesave_programている)ディスクにプログラムを書き込むために使用するハーフテキストハーフバイナリ形式。コードを読むことで、ショッピングリストのアイテムを保存することに興味があるように思われるので、補足として、I / Olisting/1との組み合わせを使用して、関心のある述語をプレーンテキストファイルに保存できることを付け加えておきます。 、などの手順open/3set_output/1、、current_output/1など。

于 2011-10-30T13:20:48.837 に答える
3

あなたは次のように書いています:「信頼できるおよび/または公式の情報源からの回答を探しています」。直接のフィードバックが必要な場合は、SWIメーリングリストに質問を投稿する必要があります。

SWI-Prolog 5.11.29、メーリングリスト

通常、あなたはループ内にSWIプロローグの主な作者と多くの貢献者を持っています。

よろしくお願いします

于 2011-10-31T00:08:05.677 に答える
2

私はSWIPrologにあまり詳しくないので、なぜエラーが発生するのかわかりませんが、/1/0は述語の引数の数を意味します。この場合、1つの引数、つまりsave/1を指定してsaveを呼び出しています。

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

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

于 2011-10-27T22:39:58.580 に答える