2011-12-31 19 views
2

Prologでプロシージャーを定義する際に問題があります。 私は2つのソースファイルを持っており、両方ともPrologエンジンに相談したいと思っています。 これは、swipl -g "['1.pl'、 '2.pl']としてPrologを呼び出すことで実行できます。Prologで述部を定義する最良の方法

両方のファイルは別のプログラミング言語で書かれた別のプログラムによって生成されており、私はあらかじめファイルの正確な内容を予測することはできません。

問題は時としてルール

predicate2(something):-body 

は、ファイルの両方に存在していないと私はエラーを取得し、ファイルのいずれかでルール

predicate1(X):-predicate2(X). 

が常に存在することである。しかし述語1に対していくつかのクエリを実行するとき、 "predicate2"は未定義です。

私は述語/ 2が(別のファイルで定義されていない場合にのみ役立ちますファイルの1つに

:- dynamic(predicate2/2). 

行が含まれている場合はそうでない場合、私はあなたが再定義したい本当に確信している」のような何かを得ます他のファイルからデータを保存するために何かを再定義する必要はありません。

述語を「定義済み」にする方法がわかりません。 -PrologまたはSICStus Prolog(残念ながら、バージョンには、ビジュアルPrologのような述語を定義するセクションはありません)

+0

あなたは何を試しましたか? –

+0

可能な方法は、predicate2(blablabla ..)のようなものを含めることです。どちらのファイルでも、私はそれが好きではない、時には型predicate2(X)のクエリがあり、X用のセットには "blablabla .."が含まれています。 –

+0

これには特別なコマンドがありますか?私は文書で役に立つ何かを見つけませんでした –

答えて

2

SWI Prologでは、このエラーを回避できます。 ISOビルトインを使用してシステムの動作を変更する

:- set_prolog_flag(unknown, Choice). 

選択肢は、(失敗、警告、エラー)のいずれかです。

だからあなたのコマンドラインは次のようになります。

swipl -g “set_prolog_flag(unknown,fail),['1.pl','2.pl']." 

別の可能性:偽の手順を定義

swipl -g “assert(predicate2(_):-fail),['1.pl','2.pl']." 

HTH

+0

ありがとう!これはsicstusとswi-prologの両方で動作します。 –

-1

明らかに、Prologは我々が策定どんな質問に答えることができません。例えば、ドナルドダックは

?- isDuck(Donald) . 
! ---------------------------------------- 
! Error 20 : Predicate Not Defined 
! Goal : isDuck(_17610) 

であれば、私たちが求める 場合Prologは、それは「何か」 があるかアヒルでない場合については何も知らないと答えるだろう。起こっているのは、論理述語 isDuck/1が定義されていない(述語が定義されていない)ため、Prologは "何か"がアヒルかどうかを確認できる ではありません。後で と表示されているように、Prologはアヒルが何であるかわからなくても、 にはアヒルとそれが何でないかを区別する方法を教えることができます。 前述のとおり、Prologは対話言語です。システムとプログラマーの間のダイアログ では、Prologは特定の質問に が答えるだけでなく、それが何であるかについても学ぶことができます 知らないです。プログラマーが定式化した質問に答えるために、Prolog はProlog が知っているすべてが登録されている知識ベースをチェックします。 Prologセッションの初めに、ナレッジベースは、他のものの間に、自然数の算術の概念と の定義を含む基本知識を維持します。セッション中に、Prologが慣れていない定義(例えば、アヒルの の定義)やProlog が知っている定義の修正や拡張を含むこの知識ベースを増やすことができるのは、 です。自然な算術演算子を含む、 番号)。事実とルールは知識ベースを表しています。事実と規則 は、一次ホーン句の構文表現です。したがって、すべて Prologの知識は、(ほとんど)排他的に最初の オーダーロジックを使用して表現されます。これがPrologが論理 言語であると言われている理由です。 Prologのプログラムは、特定の知識を表す を表す一連の事実と規則です。


+0

これは、述語が定義されているが異なるファイルに定義されているという質問には答えません。 –

3

同じ名前のISOディレクティブでpredicate2/2multifileを宣言する必要があります。だから、それぞれのファイルで、あなたが一番上に書き込み、またはpredicate2/2のいずれかの条項に先立っ:

:- multifile(predicate2/2). 

これに関係なく、あなたがその述語のための句を持っているかどうかの。


@CapelliCの提案は間違いなく危険です。存在するすべてのエラーを無効にすると、多くの正当なエラーが発生します。

たとえば、dynamic(predicate2/2)と宣言したのに、predicate2(_)を使用しました。だからあなたはどんなアリティーをしたいですか?

関連する問題