6

私は、空港データベース (空港都市、空港税と所要時間を含むフライト リンク) を含むプロローグの割り当てに取り組んでおり、最初の質問にはクエリが含まれます。質問に答えるためにPrologクエリを書くことになっています.Prologが必要以上の情報を出力しているという質問に答える方法はすでに知っています. 私が書いたクエリは次のとおりです。

flight(X,_,Y,_,N), N > 180. 

基本的には、すべての都市を一覧表示するだけです (X は出発便、Y は目的便、N は所要時間)。X と Y は必要ですが、N は必要ありません。これを機能させる唯一の方法は、このクエリをルールでラップし、X と Y を表示させることですが、ルールを記述することは想定されていないため、これを回避する方法がわかりません。明示的な答えは本当に必要ありません。おそらくヒントか何かです。

4

5 に答える 5

3

可能な場合は、IOを圧縮するよりも式を使用することをお勧めします

?- forall((flight(X,_,Y,_,N), N > 180),
           writeln((x=X,y=Y))).

たとえば、別のジェネレーターを使用します

?- forall((member(X,"12"),member(Y,"ab")),writeln((x=X,y=Y))).
x=49,y=97
x=49,y=98
x=50,y=97
x=50,y=98
true.

もちろん、テーブルを適切にインデントするには、フォーマット/2の方がはるかに効果的です...

編集 多分私はあなたがすでに考えていると仮定して、質問を誤解しました

query(X,Y) :-
  flight(X,_,Y,_,N), N > 180.
于 2012-11-25T22:09:50.087 に答える
1

を使用library(lambda)すると、表示されたままにする変数を宣言できます。

?- {X,Y}+\ ( flight(X,_,Y,_,N), N > 180 ).
X = c,
Y = d.
于 2013-05-12T22:26:30.473 に答える
0

このような 1 回限りのクエリでは、次のような単純な print ステートメントをよく使用します。

flight(X,_,Y,_,N), N > 180, print(('X' = X, 'Y' = Y)), nl, fail.

これの欠点は次のとおりです。

  1. 書式設定に力を入れない限り、出力は醜いものになる可能性があります。ここでは、通常のゴール ソリューションの Prolog 出力と同様にレンダリングする,/2項 (サブ項を含む) を作成しています。=/2

  2. さらに悪いことに、目標は実際には失敗するため ( のような多くの誤ったバインディングをすべて出力して成功するのを防ぐためN)、より大きなもので使用するのが難しい場合があります。

しかし、コマンド ラインに入力された目標に対する一連のソリューションを印刷する一方で、すべての作業変数を非表示にするのが、私が知っている最も速い方法です。

于 2012-11-25T21:37:51.847 に答える
-1

以下は許容可能な解決策を提供しますか? findall与えられた目標を満たす、与えられた用語のすべての統合を見つけます。したがって、必要に応じて回答をフォーマットできます。

findall([X, Y], (flight(X, _, Y, _, N), N > 180), Solutions).
于 2012-11-25T21:17:58.090 に答える