- 締切済み
SWI-Prologの「OR」についての質問です。
SWI-Prologについての質問です。「OR」の使い方について教えてください。 p :- q ; r. このような式があったとき、 ファクトの部分を r. のみにした場合、これをPrologで実行すると ?- p. ERROR: p/0: Undefined procedure: q/0 Exception: (7) q ? creep このように表示され、うまくいきません。 「qまたはrならばpである」という表現は、 ファクトの部分で r. のみであるときでも 論理的には成り立つものではないかと思うのですが、 q. があると成功しますが、これがなくて r. だけだとエラーが出てしまいます。 また、SWI-Prologマニュアルの「OR」、「;」の項目を調べてみても、 (URL:http://www.swi-prolog.org/pldoc/doc_for?object=( … ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ The `or' predicate is defined as: Goal1 ; _Goal2 :- Goal1. _Goal1 ; Goal2 :- Goal2. ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ このように記されているのですが 自分の知識のなさから、正直どういうことなのかさっぱりわかりません。 (いろいろなサイトを見て、自分なりに調べはしたのですが・・・) 私のPrologにおける表現が間違えているのでしょうか。 またそのような場合、適切な表現はどのようにすればよいのでしょうか。 それとも、SWI-Prologでは上記の例のような表現は そもそもできないのでしょうか。 長文かつ稚拙な文章で申し訳ありません。 何か説明不足等の点がありましたら、補足質問で補わせていただきます。 回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mandel59
- ベストアンサー率0% (0/0)
説明を忘れていました。 Goal1 ; _Goal2 :- Goal1. _Goal1 ; Goal2 :- Goal2. これは、述語 (;)/2 の定義です。; は演算子として定義されているので、 X ; Y と書くと ;(X,Y) と書いたのと同じ意味になります。複合項の形で書きなおすと、こうなります。 ;(Goal1, _Goal2) :- Goal1. ;(_Goal1, Goal2) :- Goal2. 1. Goal1 が true ならば Goal1 ; _Goal2 も true 2. Goal1 が true ならば _Goal1 ; Goal2 も true と読めます。 ドキュメントに載っている定義は、述語の働きを説明するためのものなので、処理系の実際の定義とは異なっている場合があります。実際の定義がどんなものなのか気になったときは、listing述語を使って ?- listing(;). などと入力すれば、述語の実際の定義を見ることができます。
- mandel59
- ベストアンサー率0% (0/0)
エラーメッセージ ERROR: p/0: Undefined procedure: q/0 は、述語 q/0 の定義がひとつもないという意味です。q/0の定義をすれば、動くようになります。 q が偽であると定義するのであれば、 q :- false. と定義してください。