1 | initial version |

Building on @Emmanuel_Charpentier's comment, the closest thing you can do to use the chain rule with unspecified differential forms is something like

```
sage: E.<x,y> = EuclideanSpace()
sage: z = E.scalar_field(function('Z')(x,y), name='z')
sage: z.display()
z: E^2 --> R
(x, y) |--> Z(x, y)
sage: diff(z)
1-form dz on the Euclidean plane E^2
sage: diff(z).display()
dz = d(Z)/dx dx + d(Z)/dy dy
sage: diff(1/z)
1-form d1/z on the Euclidean plane E^2
sage: diff(1/z).display()
d1/z = -d(Z)/dx/Z(x, y)^2 dx - d(Z)/dy/Z(x, y)^2 dy
sage: diff(1/z) == -1/z^2 * diff(z)
True
sage: diff(z).wedge(diff(1/z))
2-form dz/\d1/z on the Euclidean plane E^2
sage: diff(z).wedge(diff(1/z)).display()
dz/\d1/z = 0
```

But as you can see, all computations use the underlying coordinates (x,y), even in assessing coordinate-free statements like in

```
sage: diff(1/z) == -z^(-2) * diff(z)
True
```

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.