1

このタスクでは、例えばedge(1,0)edge(2,0)edge(1,3)で満たされたPrologデータベースがあります

エッジは、2つのポイントが結合されていることを意味します。

リーチ(i、j、k)という関数を作成するように求められます。ここで、iは開始点、jは終了点、kは使用できるステップ数です。Kは、再帰ループを停止するために必要です。

私が持っている唯一のエッジが1から3になり、6に到達しようとしていると仮定します。そうすると、1から6に一度に取得できなくなります。だから私はどこかに行くことができる場所を探して、そこから6に行くことができるかどうかを確認します。一度に行くことができる最初の場所は3なので、そこから6に行くようにします。

私はそうしました:

    %% Can you get there in one step (need two rules because all links are
%% from smaller to greater, but we may need to get from greater to smaller.

reach1(I, J,_K) :-
    edge(I, J).
reach1(I, J,_K) :-
    edge(J, I).
%% Chhose somewhere you can get to in one step: can you get from there
%% to your target?
reach1(I,J,K) :-
    K>1,
    edge(I, B),
    K1 is K-1,
    reach1(B,J,K1).

reach1(I,J,K) :-
    K>1,
    edge(B, I),
    K1 is K-1, 
    reach1(B,J,K1).

これは機能しますが、kを使用せずに「カット」を使用してこれを行うように求められる2番目の部分で立ち往生しています。

誰かがこれを行う方法を知っていますか、または私にいくつかのポインタを与えることができますか?

4

1 に答える 1

0

カットにより、ある方法で目標が解決されると、別の方法を探す必要がなくなります。

例:

reach(I, J,_K) :-
    edge(I, J).

カットなし-何らかの理由でPrologがバックトラックした場合、IからJに別の方法で到達しようとします。単純なエッジが機能する場合、別の方法でこのノードに到達する意味がないと感じるかもしれません。その場合は、次のことができます。

reach(I, J,_K) :-
    edge(I, J),
    !.

これは、この目標の代替案を「カット」しますが、Prologが見つけたものです。

于 2011-04-29T22:51:14.770 に答える