简明扼要地表达数学公式的句法建议

Any*_*orn 30 c++ math syntax programming-languages language-design

我正在开发C++中的功能域特定嵌入式语言,以尽可能简洁准确地将公式转换为工作代码.

我在评论中发布了一个原型,它大约有两百行.

现在我的语言看起来像这样(好吧,实际上看起来像):

// implies two nested loops j=0:N, i=0,j
(range(i) < j < N)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)];

// implies summation over above expression
sum(range(i) < j < N))[(T(i,j) - T(j,i))/e(i+j)];
Run Code Online (Sandbox Code Playgroud)

我正在寻找可能的语法改进/扩展或只是尽可能清晰和精确地表达数学公式的不同想法(在任何语言,而不仅仅是C++).

你能给我一些与我的问题有关的语法例子,这些例子可以用你认为有用的选择语言来完成.特别是,如果您对如何翻译上述代码段有一些想法,我很乐意听到它们.

谢谢.

为了澄清并给出一个实际的公式,我的短期目标是表达以下内容

替代文字替代文字

表达式简洁,其中值<>已经计算为4维数组.

mik*_*ked 6

如果你要为ab-initio世界(我从你的MP2方程中猜测)写这个,你想让它变得非常容易和清晰,以表达尽可能接近数学定义的东西.

首先,我不会有复杂的range功能.让它定义一个循环,但是如果你想要嵌套循环,请同时指定它们:

而不是

(range(i) < j < N)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)];

使用

loop(j,0,N)[loop(i,0,j)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)]]

对于诸如sum和product之类的东西,使语法"继承"它是一个循环的事实.

而不是

sum(range(i) < j < N))[(T(i,j) - T(j,i))/e(i+j)];

使用

sum(j,0,n)[loop(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]

或者如果你需要一笔双倍金额

sum(j,0,n)[sum(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]

因为看起来你正试图代表量子力学算子,所以尽量让你的语言结构在1-1的基础上与运算符匹配.这样就很容易翻译(并清楚翻译的内容).

编辑添加

因为你正在进行量子化学,所以它相当容易(至少在语法方面如此).您定义的运算符始终在它们右侧的内容上工作,然后您需要的唯一其他内容是括号,以便对运算符停止的位置进行分组.

爱因斯坦符号很有趣,你没有指定索引或边界,并且由于约定而隐含它们,但是这并没有明确的代码而且更难以思考.

对于总和,即使边界暗示,它们总是很容易根据上下文弄清楚,所以你应该总是让人们指定它们.

总和(I,O,N)和(j,0,i)的总和(A,-j,j)的总和(B,-i,i)的....

由于每个运算符都在右边工作,它的变量是已知的,所以j可以知道i,a可以知道i和j,b可以知道i,j和a.

根据我对量子化学家的经验(我也是一个人!),他们不喜欢与他们所写的不同的复杂语法.他们很乐意将双倍和三重和积分分成单个集合,因为这些只是简写.

对称性也不会那么难.它只是一个交换和添加或乘法的集合.我会做一些指定操作的操作,该操作包含相同且可以交换的元素列表:

C2V(sigma_x,A,B)A + B

这表示在c2v操作下a和b可以被认为是相同的粒子.这意味着任何具有a和b的方程(例如其后面的a + b)都应该转换为c2v变换的线性组合.sigma_x是你想要应用于你的函数的c2v中的操作,(a + b).如果我没记错的话,那就是1/sqrt(2)((a + b)+(b + a)).但我这里没有对称书,所以这可能是错的.