5

私は Prolog を使い始めたばかりですが、一見単純な例で既に問題に遭遇しています。ここに私の.plファイルがあります:

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

次に、プログラムをswiplにロードした後、プロンプトで次の行を使用してテストします

writesgoodcode(jeff).

true と表示されると思ったのですが、次のエラーが表示されます。

?- hacker(jeff).
ERROR: hacker/1: Undefined procedure: mountaindew/1
   Exception: (7) hacker(jeff) ? 

このプログラムは正常に動作しますが、これは私の問題を解決しません:

hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

$ swipl -s dumb.pl
% dumb.pl compiled 0.00 sec, 1,112 bytes

?- hacker(jeff).
true.

元のプログラムが機能しない理由を誰か説明できますか? 私の理解では、Prolog は、十分な情報がないため、最初のステートメントを「スキップ」し、次の行をチェックする必要があります。その 2 行目に十分な情報があるため、true と評価されるはずです。正しい方向への助けやポイントは素晴らしいでしょう。ありがとう。

4

3 に答える 3

5

エラー メッセージが示すように、未定義のプロシージャがありますmountaindew/1。コードが true を返すようにするためのオプションは次のとおりです。

  1. この述語を定義する
  2. この述語が動的であることを宣言します。dynamic(mountaindew/1)
  3. すべての不明な述語が失敗することを宣言します (推奨されません)。set_prolog_flag(unknown, fail)
于 2011-05-10T07:06:28.807 に答える
0

これは機能しますが、私は初心者なので理由はわかりません。「インスタンス化されていない」という言葉が当てはまる場合があります。なぜ機能するのかはわかりませんが、機能する方法を 1 つ示すと役立つと思います。

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
mountaindew(john).
doesntsleep(john).
writesgoodcode(jeff).
于 2012-07-22T23:58:03.553 に答える
0

述語の順序を変更することもできます (常に ofc を実行することはできません) が、ほとんどの場合、Kaarel が言ったことです。

結局、たとえまだコードを開発中であったとしても、常に失敗するものを書くことに意味はありません。

于 2011-05-10T08:46:26.507 に答える