Prologで多項式計算

Table of Contents

1 定数倍

多項式を定数倍した新しい多項式を求める述語 imul を作成する.

1:  imul(_, [], []).
2:  imul(B, [X|Xs], [Z|Zs]) :-
3:    Z is B * X,
4:    imul(B, Xs, Zs).

2 加算

二つの多項式の和になっている新しい多項式を求める述語 add を作成する.

1:  add([], Ys, Ys).
2:  add([X|Xs], [], [X|Xs]).
3:  add([X|Xs], [Y|Ys], [Z|Zs]) :-
4:    Z is X + Y,
5:    add(Xs, Ys, Zs).

3 乗算

二つの多項式の積になっている新しい多項式を求める関数 mul を作成する.

1:  mul([], _, []).
2:  mul([X|Xs], Ys, Zs) :-
3:    imul(X, Ys, Zs1),
4:    mul(Xs, Ys, Zs2),
5:    add(Zs1, [0|Zs2], Zs).

4 プログラム全体

プログラム全体は,以下のようになる.

 1:  imul(_, [], []).
 2:  imul(B, [X|Xs], [Z|Zs]) :-
 3:    Z is B * X,
 4:    imul(B, Xs, Zs).
 5:  
 6:  add([], Ys, Ys).
 7:  add([X|Xs], [], [X|Xs]).
 8:  add([X|Xs], [Y|Ys], [Z|Zs]) :-
 9:    Z is X + Y,
10:    add(Xs, Ys, Zs).
11:  
12:  mul([], _, []).
13:  mul([X|Xs], Ys, Zs) :-
14:    imul(X, Ys, Zs1),
15:    mul(Xs, Ys, Zs2),
16:    add(Zs1, [0|Zs2], Zs).

Cと比較して,ずいぶん簡潔であることがわかる.

実行結果は,以下のようになる.

?- imul(2, [1,-1,0,2,-3], Zs).
Zs = [2,-2,0,4,-6]

?- add([1,2,3], [1,-2,3,-4], Zs).
Zs = [2,0,6,-4]

?- mul([1,2,3], [1,-2,3], Zs).
Zs = [1,0,2,0,9]

5 練習問題

  1. 二つの多項式の差を求める述語 sub を作成せよ.
  2. 多項式と整数bが与えられた時, 多項式が単項式 x-b で割り切れるかどうか調べる述語 divisible を作成せよ.
  3. 多項式を微分した新しい多項式を求める述語 deriv を作成せよ.

Date: 2017-09-29 21:45:52 JST

Author: 田村直之

Validate XHTML 1.0