Hot Standby Routing Protocol (ホット・スタンバイ・ルーティング・プロトコル・以下HSRPと略す) は、シスコシステムズ社製のルータに実装されている、ルータの多重化を行うためのプロトコル。文字通り、ホットスタンバイの状態からルーティングできるプロトコルである。各ルータに一つずつIPアドレスを振った上で、多重化されているルータ全体にさらに1つIPアドレスを割り当て、通信する際は全体用のIPアドレスに要求を送信する。実際の通信は1台のルータで行われるが、そのルータがダウンした場合には、別のルータに自動的に交代することができる。切り替えに必要な時間は1秒程度。同様の技術にVRRPがあるが、相互運用性はない。類似の冗長化の技術の特許であるVRRPやCARPがHSRPの特許に抵触しているとシスコシステムズが主張したことがある。
append([],L,L) :- !.append([U|X],Y,[U|Z]) :- append(X,Y,Z).?- append(X,Y,[1,2]).X = [], Y = [1,2];false.元々のappendの定義を壊さず、決定性append(X,Y,Z) :- append(X,Y,Z),!.でもよい
appendを決定性に使用したい場合は、以後appendの代わりに専ら 決定性appned を使えばよい
次に、appendの第二節の末尾にカットが来る場合を考える
append([],L,L).append([U|X],Y,[U|Z]) :- append(X,Y,Z),!.このカットも非決定性を決定性に転じる場合に使われるがそう簡単な話ではない
最初にこれでは決定性述語とはならない
?- append(X,Y,[1,2]).X = [], Y = [1,2];X = [1], Y = [2];false.最初の解 X = [], Y = [1,2]; は第一節でいきなり真になってしまう
したがって、これはまだカットとは関係がない
第二解は、通常通り第三引数の先頭要素が第一引数に移動して、それで第一引数が[1|X],第二引数tがY,第三引数が[2]となって、移動した後のappendが実行され、?- append(X,Y,[2]).X = [], Y = [2]先ほどの[1|X]のXの部分に[]が来るため、X = [1], Y = [2] が取得できる
これで一旦成功することになる
成功すると、そのとたんにカットが働く
そのカットの働きで、もう第二節の本体の副目標から次の選択肢を得る指示は与えられない
?- append(X,Y,[2]). にはもう一解存在するのだが、?- append(X,Y,[2]).X = [], Y = [2]  % ここまでは使用された
X = [2], Y = []  % この解を返す指示は来ない
その解はカットの働きで、この append(X,Y,[2]) で呼び出している副目標が偽となるため、返される機会は来ない
末尾にカットが在る場合をまとめると、このカットに到達するのは、ひとつでも解が得られたときであるが、解が得られこのカットに至った場合、カット以前にある副目標によって、次の選択肢として予定されている節選択の可能性は一切なくなる
上記の表現で言い換えれば、次の解を返す指示を出せなくなる
そして、末尾にカットのある節の後にこの述語の選択節がある場合ももちろんその節が選択されることはない
説明の順序が前後したが、実行結果の否定のためには述語"\+"が用意されている
  \+(P)  はゴールPが成功したときに失敗し、失敗したとき成功する
この述語は本当の否定 "Pは偽である" ではなく "Pは証明できない" という失敗による否定で、ある種の非単調論理による推論を行う
これは以下のように定義した述語と同じ動きをする
ここで  fail  は必ず失敗する組込述語である
\+(P) :- P, !, fail.\+(_).この否定は、カットなしには定義する方法がない
論理プログラミングにおいては、「計算は、書き換えの系列として記述される」
ところがPrologにあっては、この書き換え(導出)という表現が好ましくなく場面が現出する
それはカットが導出されるような場面だ
p :- q1,q2,q3,q4.q2 :- q5,!.q2.のような副目標 p を?- p.を q2 の第一節を導出して、?- q1,q5,!,q3,q4.   % 誤りと展開して良いであろうか
これは誤りである
実際にはこのカットは働かない
カットはそれが記述された節の本体の連接の範囲の中のみで有効である
この問題を別の観点から述べると、カットの重要な性質としてそのカットを別の副目標として置換(述語の再定義)することはできないということになる
さらに実例を示そう
p(X) :- true,!,X = 1.p(X) :- X = 2.の第一節に現れるカットをcutに置き換えたとしたら、カットの働きを失う
p(X) :- true,cut,X = 1.p(X) :- X = 2.cut :- !.最も単純な置換例が上記であるが、これでは、バックトラック後に第二節の実行を妨げられない
?- p(X).X = 1;X = 2.ここで分ることは、カットは ! が書かれた「節の実行制御」としてのみ有効ということである
カットを検証する時、取るべきプログラマの視点について最後に記す
プログラマは定義された述語の各節の本体にのみ焦点を合わせる
そして、その部分に現れるカットによってバックトラックしなくなる本体のカットより前の部分と利用されることがなくなる後続する定義節の存在は視野に入れる必要があるが、導出される謂わば子タスクとしての副目標内に現れるカットは考慮の対象から完全に外す必要がある
カットが論理プログラミングをどんなに逸脱していても、その利用が不可避である以上、このカットの有効範囲の認識はPrologの基本中の基本である