2

I have a problem with defining procedures in Prolog. I have two source files and want to consult Prolog engine with both of them. This can be done by invoking Prolog as swipl -g “['1.pl','2.pl'].

Both of the files are generated by another program written in another programming language and i can't predict the exact content of the files beforehand.

The problem is that in one of the files there is always a rule

predicate1(X):-predicate2(X).

But,sometimes the rule

predicate2(something):-body

does not exist in both of the files and i get a error "predicate2" is undefined, when executing some queries for predicate1.

If i include the line

:- dynamic(predicate2/2). 

into one of the files it only helps if predicate/2 is not defined in another file (otherwise i get something like "are you really sure you want to redefine the predicate2/2?". And here i don't want to redefine something to save the data from another file.

So,i have no idea how to make the predicate just "defined". I need a solution for SWI-Prolog or SICStus Prolog. (unfortunately the versions do not have a section for defining predicates,like visual Prolog)

4

3 に答える 3

2

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

:- set_prolog_flag(unknown, Choice).

選択肢は(失敗、警告、エラー)の1つです。

したがって、コマンドラインは次のようになります。

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

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

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

HTH

于 2011-12-31T11:20:36.080 に答える
-1

明らかに、Prolog は私たちが定式化した質問に答えることができません。たとえば、ドナルドはアヒルかどうか尋ねたら

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

プロローグは、「何か」がアヒルであるかどうかについては何も知らないと答えます。それが起こっているのは、論理述語 isDuck/1が定義されていない (述語が定義されていない) ため、Prolog は「何か」がアヒルであるかどうかを確認できません。後で見るように、プロローグはアヒルが何であるかを知らなくても、アヒルであるかどうかを区別する方法を教えることができます。前に述べたように、Prolog は対話言語です。システムとプログラマーの間の対話で、Prolog は特定の質問に答えることができるだけでなく、知らないことについても学ぶことができます。プログラマーが作成した質問に答えるために、Prolog は、Prolog が知っているすべてが登録されているナレッジ ベースをチェックします。Prolog セッションの開始時に、ナレッジ ベースには、自然数の算術の概念と定義などを含む基本的な知識が保持されます。セッション中に、Prolog が慣れていない定義や概念 (たとえば、アヒルの定義) を含めて、この知識ベースを増やしたり、Prolog が知っている定義を変更および拡張したり (たとえば、新しい算術演算子を含める) することができます。自然数の場合)。事実と規則は知識ベースを表現します。ファクトとルールは、一次ホーン節の構文表現です。したがって、すべての Prolog の知識は、(ほぼ) 一次ロジックのみを使用して表現されます。これがPrologが論理言語と言われる所以です。Prolog のプログラムは、特定の知識を表現する一連の事実と規則です。または、Prolog が認識している定義を変更および拡張することもできます (たとえば、自然数の新しい算術演算子を含めるなど)。事実と規則は知識ベースを表現します。ファクトとルールは、一次ホーン節の構文表現です。したがって、すべての Prolog の知識は、(ほぼ) 一次ロジックのみを使用して表現されます。これがPrologが論理言語と言われる所以です。Prolog のプログラムは、特定の知識を表現する一連の事実と規則です。または、Prolog が認識している定義を変更および拡張することもできます (たとえば、自然数の新しい算術演算子を含めるなど)。事実と規則は知識ベースを表現します。ファクトとルールは、一次ホーン節の構文表現です。したがって、すべての Prolog の知識は、(ほぼ) 一次ロジックのみを使用して表現されます。これがPrologが論理言語と言われる所以です。Prolog のプログラムは、特定の知識を表現する一連の事実と規則です。これがPrologが論理言語と言われる所以です。Prolog のプログラムは、特定の知識を表現する一連の事実と規則です。これがPrologが論理言語と言われる所以です。Prolog のプログラムは、特定の知識を表現する一連の事実と規則です。


于 2014-04-15T16:50:02.287 に答える