1

以下に示すように、バックトラックが実行されると想定します。各エンドポイントは成功または失敗を示します。

Ex:

    foo(X, search_key).

Backtracking :
                Root

              /   |  \
             /    |   \
            /     |    \
           /|\    |     \
          / | \   |    /|\
         /  f f   |   / | \
        /         |  f  |  f
       f          g     f

Abbreviation  f : fail
              g show first character of name

他に方法が見つからない限り、次の関数で引数としてgを使用することは好みませんが、この例では、他の方法が見つからないため、次の関数で引数としてgを使用する必要があります。

どうやってやるの ?

4

1 に答える 1

1

最初にすべてのエンドポイントを試し、それらをリストに保存する必要があります(findall(foo...)おそらく)。そうしないと、後で非gが発生するかどうかがわかりません。

次に、Xがgではないという要件で次の関数を実行してみます。それが失敗した場合は、とにかくgを使用してください。

avoidg(X) :-
    member(A,X),
    A \= f,
    A \= g,
    write(A).

avoidg(X):-
    member(A,X),
    A \= f, 
    write(A).

例:

?- avoidg([f,f,f,g,f,f,f]).
g
true 

 ?- avoidg([f,f,f,g,f,f,h]).
h
true 
于 2012-06-03T11:45:47.543 に答える