2015-04-03 2 views
1

Я хочу сделать символическую программу дифференциации в OZ Mozart, но я застрял, не знаю, как начать, в прологе будет что-то вроде правил ниже, но мне нужна помощь по крайней мере в как сделать наиболее симплексное правило в OZ, производная от X равна 1, например, с тем, что я мог бы сделать остальную часть кода, спасибо!Как построить символический дифференциал OZ Mozart

d(X, X, 1):- !.     /* d(X) w.r.t. X is 1  */ 

d(C, X, 0):- atomic(C).   /* If C is a constant then */ 
            /* d(C)/dX is 0   */ 

d(U+V, X, A+B):-     /* d(U+V)/dX = A+B where */ 
    d(U, X, A),     /* A = d(U)/dX and   */ 
    d(V, X, B).     /* B = d(V)/dX    */ 

d(U-V, X, A-B):-     /* d(U-V)/dX = A-B where */ 
    d(U, X, A),     /* A = d(U)/dX and   */ 
    d(V, X, B).     /* B = d(V)/dX    */ 

d(C*U, X, C*A):-    /* d(C*U)/dX = C*A where  */ 
    atomic(C),     /* C is a number or variable */ 
    C \= X,      /* not equal to X and  */ 
    d(U, X, A), !.    /* A = d(U)/dX    */ 

d(U*V, X, B*U+A*V):-   /* d(U*V)/dX = B*U+A*V where */ 
    d(U, X, A),     /* A = d(U)/dX and   */ 
    d(V, X, B).     /* B = d(V)/dX    */ 

d(U/V, X, (A*V-B*U)/(V*V)):- /* d(U/V)/dX = (A*V-B*U)/(V*V) */ 
    d(U, X, A),    /* where A = d(U)/dX and  */ 
    d(V, X, B).    /*  B = d(V)/dX   */ 

d(U^C, X, C*A*U^(C-1)):-  /* d(U^C)/dX = C*A*U^(C-1) */ 
    atomic(C),     /* where C is a number or */ 
    C\=X,       /* variable not equal to X */ 
    d(U, X, A).     /* and d(U)/dX = A   */ 

d(U^C, X, C*A*U^(C-1)):-  /* d(U^C)/dX = C*A*U^(C-1) */ 
    C = -(C1), atomic(C1),  /* where C is a negated number or */ 
    C1\=X,      /* variable not equal to X */ 
    d(U, X, A).     /* and d(U)/dX = A   */ 

d(sin(W), X, Z*cos(W)):-  /* d(sin(W))/dX = Z*cos(W) */ 
    d(W, X, Z).     /* where Z = d(W)/dX   */ 

d(exp(W), X, Z*exp(W)):-  /* d(exp(W))/dX = Z*exp(W) */ 
    d(W, X, Z).     /* where Z = d(W)/dX   */ 

d(log(W), X, Z/W):-   /* d(log(W))/dX = Z/W  */ 
    d(W, X, Z).     /* where Z = d(W)/dX   */ 

d(cos(W), X, -(Z*sin(W))):- /* d(cos(W))/dX = Z*sin(W) */ 
    d(W, X, Z).     /* where Z = d(W)/dX   */ 

ответ

1

Вы должны искать логическое программирование в Oz в качестве отправной точки. Начните искать Here для более подробной информации. Вы можете определить аксиомы в Oz, как в Prolog. К сожалению, я не такой специалист, поэтому больше не могу помочь тебе.

Смежные вопросы