0

が の隣人であるis_adjacent([X1,Y1], [X2,Y2])場合、真である節があります。この場合、私が尋ねると、すべての可能な結果 (4 つ) が得られます。[X2,Y2][X1,Y1]is_adjacent([2,2], [X,Y])

is_adjacent([2,2],[X,Y]).
X = 2,
Y = 3 ;
X = 3,
Y = 2 ;
X = 2,
Y = 1 ;
X = 1,
Y = 2.

この動作を別の節で使用したい:

anotherClause :-
    is_adjacent([2,2],[X,Y]),
    [to be continued...].

さて、考えられるすべての結果を自動的に処理するにはどうすればよいでしょうか? たとえば、すべての結果が特定のリストのメンバーであるかどうかを確認したい場合。

回答ありがとうございます。

4

4 に答える 4

0

すべてのソリューションを収集したい場合は、 predicate のセットを探しているのではないかと思いますsetof。これは、述語のすべての解を見つけます。

setof([X,Y], is_ajacent([2,2],[X,Y], Z)

それから

Z = [[2,3], [1,2], ...]

すべてのソリューションを収集するのではなく、ソリューションごとに何かを行うだけの場合は、dasblinkenlight の 2 番目のソリューションが示すように実行します。特にfail最後に、Prolog は次の解決策を試みます。そしてついに成功。

于 2013-04-18T14:36:40.393 に答える
0

double-not アプローチで ∀ (すべて) を ∃ (存在する) に変換する方法があります:
∀xf(x) = ¬¬∀xf(x) = ¬∃x.¬f(x)

anotherClause :- \+(notAnotherClause).
notAnotherClause :- is_adjacent([2,2],[X,Y]), \+(memberchk([X,Y], SomeList)).

アイデアは、すべての選択肢内で否定的な結果の存在を検索し、それがないことは実際には「すべてのバリアントに対して」を意味するということです。

PS \+/1( ) は( )\+(Goal)と表記されることもあるnot/1not(Goal)

于 2013-04-19T09:46:00.047 に答える
0

のすべての結果をis_adjacent他のルールと照合するには、次のようにそのルールをXandで記述するだけで済みますY

anotherClause :-
    is_adjacent([2,2],[X,Y]),
    X > 0,
    Y > 0,
    check_x_and_y(X, Y, Result),
    ...

等々。を評価するとanotherClause、Prolog は最初の値のセットでXandYを統合し、句の残りの部分に進みます (上記では、XandYがゼロより大きいことを確認し、ルールで 2 つの変数を評価していますcheck_x_and_y。ルールが来ると、セット全体が使い果たされるまで常に続行したい場合 (たとえば、 Xandのすべての割り当てを出力するY場合)、パターンは次のようになります:

anotherClause :-
    is_adjacent([2,2],[X,Y]),
    print_x_and_y(X,Y),
    fail.

anotherClause.

X最初のルールは、 、の各割り当てを通過Yし、それらを出力してから、再評価のトリガーに失敗します。2 番目のルールは、それ以上の評価を停止するための包括的な事実です。

これは、隣接するセルのすべてのペアを出力するideone のデモへのリンクです。

于 2013-04-18T14:23:36.567 に答える