私の最後の試験ではdouble/2
、次の指示に従って、 と呼ばれる Prolog 述語を作成するdouble(X, Y)
必要がありY
ましX
たX
。たとえば、クエリの
double([1, 3, 2, 4], X).
結果は
X = [1, 3, 4, 8].
functoreven/1
を定義せずに簡単に使用できるようにしました (実際、定義するのは非常に簡単です)。これは、引数が偶数の場合は true であり、そうでない場合は false です。私は実際に functor も使用してプログラムを作成することになりましたodd/1
。しかし、教授は私にこう言いました。では、どうしてこのように書けるようになったのだろうか。
私が書いたものは次のとおりです。
double([], []).
double([N|L], [N|D]) :- odd(N), !, double(L, D).
double([N|L], [M|D]) :- even(N), M is 2*N, double(L, D).
even(N)
注意:コードの最後の行から削除しても (つまり、 only を使用する場合odd(N)
、これは only を使用するのと実質的に同じです。これは、even(N)
そのうちの 1 つしか使用しないためです)、プログラムは引き続き機能します。しかし、これは望ましい解決策ではありません。なぜなら、この方法では「カット」が赤いカットになるからです (私のプログラムでは緑のカットです)。