2014-11-14 54 views
1

我想用Prolog來實現乘以兩個多項式的多項式乘法。以下是SML中給出的代碼,但我需要在Prolog中使用它。 SML的測試解決方案是poly_mult([1.0,5.0,1.0],[3.0,〜10.0,15.0]);並會返回val it = [3.0,5.0,〜32.0,65.0,15.0]:真正的列表我試圖在Prolog中編寫代碼,但我擁有的是不正確的。誰能幫忙?謝謝!在Prolog中乘以兩個多項式

在SML

fun poly_add (M,nil) = M 
| poly_add (nil,N) = N 
| poly_add ((m:real)::mr, n::nr) = (m+n)::poly_add(mr,nr); 

fun scalar_mult (nil,m) = nil 
| scalar_mult((m:real)::mr,n) = (m*n)::scalar_mult(mr,n); 

fun poly_mult (M,nil) = nil 
| poly_mult (M,n::nr) = poly_add (scalar_mult(M,n), 0.0::poly_mult(M,nr)); 

我有什麼在序言

poly_add(Constant,[],Constant) :- !. 
poly_add([],Constant2,Constant) :- !. 
poly_add([Head1 | Head2], [Tail | Tail2], [HeadSum |TailSum]) :- 
    HeadSum is Head + Tail, 
    poly_add(Head2, Tail2, TailSum). 

scal_mult([],Head,[]) :- !. 
scal_mult([Head | Head2], [Tail], [HeadMult | TailMult]) :- 
    HeadMult is Head * Tail, 
    scal_mult(Head2, Tail, TailMult). 

poly_mult(Constant,[],[]) :- !. 
poly_mult([Constant], [Tail | Tail2]) :- 
    poly_add(scal_mult([Constant, Tail]), [0 | poly_mult] ([Constant, Tail2]). 
+0

能否請您詳細說明*我有什麼是不正確的*? – lurker 2014-11-14 19:28:19

+1

其中之一,'poly_mult/3'必須有不同的定義:Prolog沒有函數。它建立(良好)關係,變量和術語之間的關係。 – false 2014-11-14 19:37:30

+0

它爲測試而不是答案返回false。我不認爲我的代碼在Prolog中是正確的,但是在SML中是正確的。 – mpeytonfan18 2014-11-14 20:18:21

回答

3
poly_sum(Ms,[],Ms) :- Ms = [_|_]. 
poly_sum([],Ns,Ns). 
poly_sum([M|Ms], [N|Ns], [S|Ss]) :- 
    S is M+N, 
    poly_sum(Ms, Ns, Ss). 

scal_prod([],_Sc,[]). 
scal_prod([M|Ms], Sc, [P|Ps]) :- 
    P is M*Sc, 
    scal_prod(Ms, Sc, Ps). 

poly_prod(_,[],[]). 
poly_prod(Ms,[N|Ns], Xs2) :- 
    poly_prod(Ms,Ns, Xs1), 
    scal_prod(Ms, N, Ps), 
    poly_sum(Ps, [0.0|Xs1], Xs2). 


?- poly_prod([1,2,3,4],[5,6,7],Xs). 
Xs = [5.0, 16.0, 34.0, 52, 45, 28] ; 
false. 
+1

這就是我一直在尋找的東西。謝謝!!! – mpeytonfan18 2014-11-15 00:25:49

+1

@ mpeytonfan18:然後您可以通過點擊複選標記來接受它 - 請參閱以下內容:http://stackoverflow.com/tour – false 2014-11-15 11:36:58