2

Prologを学習する過程で、与えられた物がその物の左/右/上/下にあるものを伝えることができる簡単なプログラムを作成しています。コードはこれです:

% left_(LeftThing, ToThing)
left_(bicycle, camera).
left_(pencil, clock).
left_(clock, butterfly).
left_(butterfly, fish).

% above_(AboveThing, ToThing)
above_(bicycle, pencil).
above_(camera,  butterfly).

right(X, Y) :-
  left_(Y, X);
  X = (empty).

below(X, Y) :-
  above_(Y, X);
  X = (empty).

left(X, Y) :-
  left_(X, Y);
  X = (empty).

above(X, Y) :-
  above_(X, Y);
  X = (empty).

position(Thing, Left, Right, Above, Below) :-
    left(Left,  Thing),
   right(Right, Thing),
   above(Above, Thing),
   below(Below, Thing), !.

今私が尋ねるとき:

?- position(clock, Left, Right, Above, Below).

私は答えを得ます:

左=鉛筆、
右=蝶、
上 = 下、下 = 空。

これは完全に正しい答えですが、Prolog に完全な置換を行い、標準的な方法で出力してもらいたいと思います。

左=鉛筆、
右=蝶、
上=空、
下=空。

プログラムの事実や規則を散らかさずに、出力でそのような置換を行うように Prolog に強制する方法はありますか? (エラー... SWI-Prolog 構成にいくつかの結果フォーマット オプションがある可能性があります。そうでない場合 - 最小限のコード変更でこれを実現するにはどうすればよいですか?)

4

2 に答える 2

2

この動作を制御するフラグが見つからず、内部的に (boot/toplevel.pl を参照) join_same_bindings/2 が無条件に呼び出されます。

文書化されていない述語 print_toplevel_variables/0 がありますが、出力は順序付けられておらず、最後のクエリとは無関係の「履歴」変数が含まれています。

?- position(clock, Left, Right, Above, Below).
Left = pencil,
Right = butterfly,
Above = Below, Below = empty.

?- print_toplevel_variables.
$Below =    empty
$Above =    empty
$Right =    butterfly
$Left =     pencil
$X =        false
$T =        position(clock,pencil,butterfly,empty,empty)
$Y =        1
false.
于 2012-09-06T15:03:14.293 に答える