Somewhat OT: defining algebras in D

Amorphorious Amorphorious at gmail.com
Fri Feb 9 23:55:14 UTC 2018


On Friday, 9 February 2018 at 17:10:11 UTC, Simen Kjærås wrote:
> On Friday, 9 February 2018 at 15:45:11 UTC, Amorphorious wrote:
>> On Friday, 9 February 2018 at 02:40:06 UTC, Nick Sabalausky 
>> (Abscissa) wrote:
>>> Well, that's the difference between a formal library package 
>>> release vs sharing a working proof of concept jotted down to 
>>> pass time ;)
>>
>> Yes, but he can go back an add some friendly text at some 
>> point... He knows most about it so it is much easier and 
>> shouldn't take more than a few mins.
>
> Indeed I can, and I have:
>
> https://gist.github.com/Biotronic/833680b37d4afe774c8562fd21554c6b
>
> Doing so after a long, tiring day at work for something I just 
> did to pass the time, though - not worth it when I wanted a 
> shower and some sleep. Luckily, today was just as boring, so I 
> cleaned up the syntax a bit, added more sensible error 
> messages, and even made it do the right thing by default when 
> you leave out a rule:
>
> alias complex = Algebra!(
>         float,
>         "1,i",
>         "i" * "i".op = -1);
> alias dual = Algebra!(
>         float,
>         "1,e",
>         "e" * "e".op = 0);
> alias splitComplex = Algebra!(
>         float,
>         "1,j",
>         "j" * "j".op = 1
>         );
> alias quaternion = Algebra!(
>         float,
>         "1,i,j,k",
>         "i,j,k" * "i,j,k".op = -1,
>         "i,j,k" * "j,k,i".op = "k,i,j".antiCommutative
>         );
>
> --
>   Simen

Lol, thanks, but that wasn't much. What I was thinking is a sort 
of paragraph of text at the top that sorta describes the overall 
conceptualization/overview. One still has to understand how all 
the pieces fit and the only way to learn that is by learning the 
pieces. And English equivalent of D code isn't really all that 
useful because anyone that knows D can understand the D code.

E.g.,

// Create a canonical list of rules from compound rules.
template Canonicalize(string units, Rules...)

is not really all that useful

rather, which I'm making up some type of overview:

"Creates algebraic structures[Algebra!(base type, 
relators/varables, relations...)]  using composition 
rules(relations) to define the structure. To define an algebra 
type, say, the quaternions of base type float,

  alias quaternion = Algebra!(
          float,
          "1,i,j,k",
          "i,j,k" * "i,j,k".op = -1,
          "i,j,k" * "j,k,i".op = "k,i,j".antiCommutative
          );

which can be used a type:

quaternion(a,b,c,d) q;  // Defines the quaternion q = a + bi + cj 
+ dk.

--

the main bulk of defining an algebra as the relations. Each 
relation consists of  a string expressions sk involving the 
realtors expressing the relation equation as

f(s1,..,fn).op = s0

where f is an algebraic function and s0 is a the special 
relator(whatever). relators can be used as a csl.

e.g., for quats,

"i,j,k" * "i,j,k".op = -1

says that i*i = -1, j*j = -1, k*k = -1. Each of the rules could 
have been specified individually:

"i" * "i".op = -1
"j" * "j".op = -1
"k" * "k".op = -1

One can append a string expression using "property syntax":

"i,j,k" * "j,k,i".op = "k,i,j".antiCommutative

.antiCommutative states that the relator is anti commutative. 
Other properties are:

........
........
........ (no others?)

Once and algebra is established it can then act as any complex 
type and used as a functioning algebra.
"

etc.

The idea here is that to write a few paragraphs of English text 
so that one can read from the start to finish and understanding 
the general idea of what is going on without having to read 
through the entire code(which is much longer) and try to put the 
pieces together. The code I presented is what gleaned from what 
you are trying to accomplish and my knowledge of abstract 
algebra(which most don't have).

What's important is that the average person shouldn't have to 
learn your code to know how to use it. It is not important of the 
details(of which I haven't looked at) but just how to use them. 
While you give examples, which is good, the only problem is one 
can't necessarily glean from those examples how to create their 
own algebras. e.g., what about the GL(n,Z)? Is it possible?


  alias GLnZ = Algebra!(
          Matrix!(n,Z),
          "e_i_j" = 1,
          );

Obviously I doubt this would work, but it would be cool if it 
did, but the only way I could know is if I learned your code and 
tried to figure out how to massage it to work, if it could.. and 
that may take up more time than it would be to do my own 
implementation which I would understand better.

Hence adding clarifications to the code then help one make better 
decisions:

e.g.,

"Base Type must be a D primitive".

(again, the only way one can know if your code supports a general 
type is to learn the code, which may require one to learn all the 
code).


I'm not saying you have to do this, of course... just saying it 
would be more more helpful. I'm not sure how general your code is 
but if one could basically make arbitrary algebraic types, it 
would be very cool indeed and probably be pretty useful when 
people learned where to use it.






More information about the Digitalmars-d mailing list