Skip to main content

output formatting - What's the difference between 56 and Integer[56]?



I'm trying to grasp how to Wolfram Language uses symbolic expressions for everything. The concept of doing so makes sense to me, but the language doesn't behave how I predict.


I understand how writing x + y is really writing Plus[x, y].


But my understanding then predicts that writing 56 is really writing Integer[56]. And that writing something like 2 + 3 is really writing Plus[Integer[2], Integer[3]].


FullForm says otherwise, though. If I do FullForm[56] I just get back 56. And if I do FullForm[Integer[56]] I get back Integer[56].


TreeForm agrees with FullForm. Here is what predict I should see when doing TreeForm[Integer[56] + 56 * 2]:


The predicted results of running TreeForm on the previously described input.



And here's what I actually get:


The true results of running TreeForm on the previously described input.


So what's happening to cause these difference between my prediction and what I actually see?


Edit:


The answer may have something to do with "atomic objects", which are briefly discussed here: https://reference.wolfram.com/language/tutorial/BasicObjects.html#15871


It's not very helpful, though. Why are these objects atomic? What is the use of having both 56 and Integer[56]? And why does Head[56] produce Integer if 56 is specifically supposed to be atomic--not breakable into any smaller pieces, like a head? AtomQ is a thing. But what does the Q stand for? http://reference.wolfram.com/language/ref/AtomQ.html is silent on the rationale behind the name.


Edit 2:


Based on answers and comments made prior to this edit, I've updated my understanding.


I think my basic problem was that I assumed that an expression passed to FullForm or TreeForm is not evaluated. This would be the intuitive behavior, especially for a student learning about the order of arithmetic operations.


But that behavior would also require that different functions differ on whether they choose to evaluate an expression or not, and that would introduce an rather arbitrary complexity to the whole enchilada. Users would need to remember which functions do or don't evaluate expressions passed as arguments. Yech.



If, however, I go with the idea that expressions are always evaluated, then it makes perfect sense that FullForm[2 + 2] and FullForm[Plus[2, 2]] give back 4, because 2 + 2 and Plus[2, 2] would be evaluated before FullForm ever got to see them.


And so immediately wondered about how to prevent an expression from being evaluated. And HoldForm appeared, and now I can do TreeForm[HoldForm[2 + 2]] to get:


The results of running TreeForm in the previously described input.


Which is fundamentally what I expect.


However. It still doesn't make sense that Head[56] gives back Integer. As before, 56 is supposed to be atomic. It's obvious that it's useful to be able test what 56 is, but I'm having hard time coping with the idea that a thing described as atomic.. isn't. And that's a different question.


Thanks to those who helped sort me out.



Answer



Integer[56] has no special meaning in Mathematica. However, Integer is a symbol, so it's a perfectly valid expression by itself. 56 is a valid argument. So, Integer[56] is a proper expression, although it has no built-in meaning. You may, however, write patterns that match it, so you may define your own transformations that apply to it. That's how Mathematica works: it's an expression rewriting language. If it doesn't recognize a valid expression, it leaves it alone.


Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1.