(中間質問の波の中に忍び込ませてください。)
2 つの自然数の和の一般的な定義は次のnat_nat_sum/3
とおりです。
nat_nat_sum(0, N, N).
nat_nat_sum(s(M), N, s(O)) :-
nat_nat_sum(M, N, O).
厳密に言えば、この定義は一般的すぎます。
?- nat_nat_sum(A, B, unnatural_number).
同様に、次の回答置換が得られます。
?- nat_nat_sum(0, A, B).
A = B.
この答えの置換はすべての自然数を含むと解釈し、他の項は気にしません。
それを踏まえて、その終了特性を考えてみましょう。実際、次の障害スライスを考慮するだけで十分です。つまり、nat_nat_sum/3
このスライスが終了しないと、終了しないだけではありません。今回も全く同じ!したがって、私たちは iff と言うことができます。
nat_nat_sum(0, N, N) :- false. nat_nat_sum(s(M)、N、s(O)):- nat_nat_sum(M, N, O), false .
この失敗スライスは、1 番目と 3 番目の引数の間の対称性を明らかにします。どちらもまったく同じ方法で非終了に影響を与えます! したがって、それらはまったく異なるものを記述していますが (一方は被加数、もう一方は和)、それらは終了に対してまったく同じ影響を与えます。そして、貧弱な 2 番目の引数はまったく影響を与えません。
念のため言っておくと、障害スライスは共通の終了条件 ( cTI を使用) で同一であるだけでなく、
nat_nat_sum(A,B,C)terminates_if b(A);b(C).
また、この条件でカバーされていない場合でも、まったく同じように終了します。
?- nat_nat_sum(f(X),Y,Z).
今私の質問:
nat_nat_sum/3
終了条件を持つ別の定義はありますか?nat_nat_sum2(A,B,C) terminates_if b(A);b(B);b(C).
(はいの場合はそれを示してください。いいえの場合はその理由を説明してください)
言い換えれば、新しい定義は、その引数の1 つnat_nat_sum2/3
がすでに有限で根拠がある場合に終了する必要があります。
細字。純粋で単調な Prolog プログラムのみを考慮してください。(=)/2
つまり、および以外に組み込みはありません。dif/2
(これには 200 の報奨金を与えます)