>>751
p :- q1,!.
p :- q2.

のカットはq1に副作用がなければ、

p :- q1.
p :- \+(q1),q2.
と書くことができる。

p(s(1,t(2)) :- !,q1.
p(s(X,t(Y)) :- q2.



p(s(1,t(2)) :- q1.
p(s(X,t(Y)) :- \+(X=1),\+(Y=2),q2.

としなくてはならない。
カットがPrologから切り捨てられない話として、否定の定義、

\+(P) :- call(P),!,fail.
\+(P).

がよくあげられる。このカットは代用が効かない。
それから組込述語findall/3の設計からくる問題なのだが、repeatを持つ
標準入力からの入力。(ここでは整数に限定しているが)

?- findall(X,(repeat,read(X),(X=end_of_file,!,fail;integer(X))),L).

この制御のためのカットも他に手がない。