2

次のタスクがあります。

2 つの多項式を追加するメソッドを作成します。つまり、0+2*x^3 と 0+1*x^3+2*x^4 は 0+3*x^3+2*x^4 になります。

次のコードも書きました。

add_poly(+A1*x^B1+P1,+A2*x^B2+P2,+A3*x^B3+P3):-
    (
       B1=B2,
       B3 = B2,
       A3 is A1+A2,
       add_poly(P1,P2,P3)
    ;
       B1<B2,
       B3=B1,
       A3=A1,
       add_poly(P1,+A2*x^B2+P2,P3)
    ;
       B1>B2,
       B3=B2,
       A3=A2,
       add_poly(+A1*x^B1+P1,P2,P3)
    ).
add_poly(X+P1,Y+P2,Z+P3):-
    Z is X+Y,
    add_poly(P1,P2,P3).

私の問題は、停止する方法がわからないことです。引数の 1 つが null の場合は停止し、2 番目の引数を 3 番目の引数に追加したいと思います。しかし、それらがnullであることを確認するにはどうすればよいですか? ありがとう。

4

2 に答える 2

1

いくつかの注意事項:

最初は選言を避けるようにしてください(;)/2。読みやすくするには、特別なインデントが必要です。そして、それらは 1 つのルールを読むことをより複雑にします —(=)/2書き、追跡しなければならないすべての追加の目標を考えてみてください。


次に、多項式について何を想定できるかわかりません。それらが標準的な形式で書かれていると思いますか?


そしてあなたのプログラムのために: 最初のルールの head を考えてみましょう:

add_poly(+A1*x^B1+P1,+A2*x^B2+P2,+A3*x^B3+P3):-

引数のいくつかを一般化します。

add_poly(+A1*x^B1+P1,_,_):-

およびいくつかのサブターム:

 add_poly(+_+_,_,_):-

これは以下に対応します。

add_poly(+(+(_),_),_,_) :-

あなたがこれを好きかどうかわかりません。

したがって、このルールは接頭辞で始まり、+その後に中置辞が続く用語にのみ適用され+ます。少なくとも、サンプル データにはプレフィックスが含まれていませんでした+

また、+-operator が結合されたままになっていることに注意してください。つまり1+2+3+4、左に関連付けられます。

?- write_canonical(1+2+3+4).
+(+(+(1,2),3),4)

したがって、用語がある場合0+3*x^3+2*x^4、最初に「表示」されるのは_+2*x^4です。左側の用語は、より深くネストされています。


実際の質問 (停止方法) については、左端のサブ項が整数であることを明示的にテストする必要があります。使用するinteger/1か、(*)/2 (仮定によって異なります) を使用することもできます。

于 2012-07-28T17:49:07.877 に答える
1

あなたが話している多項式は1つの変数にあり、整数指数を持っていると思います。

ここでは、通常の多項式形式で動作する手順: 多項式は、因数のリスト (合計) として表すことができます。ここで、(整数) 指数は位置によって暗黙的に表されます。

:- [library(clpfd)].

add_poly(P1, P2, Sum) :-
    normalize(P1, N1),
    normalize(P2, N2),
    append(N1, N2, Nt),
    aggregate_all(max(L), (member(M, Nt), length(M, L)), LMax),
    maplist(rpad(LMax), Nt, Nn),
    clpfd:transpose(Nn, Tn),
    maplist(sumlist, Tn, NSum),
    denormalize(NSum, Sum).

rpad(LMax, List, ListN) :-
    length(List, L),
    D is LMax - L,
    zeros(D, Z),
    append(List, Z, ListN).

% the hardest part is of course normalization: here a draft

normalize(Ts + T, [N|Ns]) :-
    normalize_fact(T, N),
    normalize(Ts, Ns).
normalize(T, [N]) :-
    normalize_fact(T, N).

% build a list with 0s left before position E
normalize_fact(T, Normal) :-
    fact_exp(T, F, E),
    zeros(E, Zeros),
    nth0(E, Normal, F, Zeros).

zeros(E, Zeros) :-
    length(Zeros, E),
    maplist(copy_term(0), Zeros).

fact_exp(F * x ^ E, F, E).
fact_exp(x ^ E, 1, E).
fact_exp(F * x, F, 1).
fact_exp(F, F, 0).

% TBD...
denormalize(NSum, NSum).

テスト:

?- add_poly(0+2*x^3, 0+1*x^3+2*x^4, P).
P = [0, 0, 0, 3, 2]

答えはまだ通常の形式です。denormalize/2 を書く必要があります...

于 2012-07-28T20:21:04.577 に答える