【发布时间】:2015-01-14 11:05:16
【问题描述】:
我将创建一个可以从L-system 语法生成字符串的程序。
Astrid Lindenmayer 用于模拟藻类生长的原始 L 系统是:
变量:A B 常数:无 公理:A 规则:(A→AB),(B→A)产生:
迭代 |结果模型 0 |一种 1 | AB 2 | ABA 3 | ABAAB 4 |阿里巴巴 5 | ABAABABABAAB这是我自己在J中天真地实现的:
algae =: 1&algae : (([: ; (('AB'"0)`('A'"0) @. ('AB' i. ]))&.>"0)^:[) "1 0 1
(i.6) ([;algae)"1 0 1 'A'
┌─┬─────────────┐
│0│A │
├─┼─────────────┤
│1│AB │
├─┼─────────────┤
│2│ABA │
├─┼─────────────┤
│3│ABAAB │
├─┼─────────────┤
│4│ABAABABA │
├─┼─────────────┤
│5│ABAABABAABAAB│
└─┴─────────────┘
分步说明:
('AB' i. ]) 'ABAAB' NB. determine indices of productions for each variable
0 1 0 0 1
'AB'"0`('A'"0)@.('AB' i. ])"0 'ABAAB' NB. apply corresponding productions
AB
A
AB
AB
A
'AB'"0`('A'"0)@.('AB' i. ])&.>"0 'ABAAB' NB. the same &.> to avoid filling
┌──┬─┬──┬──┬─┐
│AB│A│AB│AB│A│
└──┴─┴──┴──┴─┘
NB. finally ; and use ^: to iterate
以此类推,这是L-system that generates Thue–Morse sequence第四次迭代的结果
4 (([: ; (0 1"0)`(1 0"0)@.(0 1 i. ])&.>"0)^:[) 0
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
这是迄今为止我能做到的最好的。我认为这里的装箱-拆箱方法是不够的。这是我第一次错过 J 中的链表——没有它们就很难编写语法。
我真正想到的是:
a) 构建构建最终字符串的那些函数的动名词列表(在我的示例中,这些函数是常量,如'AB'"0,但在树建模函数的情况下是海龟图形命令)并唤起(`:6)它,
或者我能够编码的东西:
b) 构造一串合法的 J 语句来构建最终字符串并执行 (".)。
但我不确定这些程序是否有效。
- 您能告诉我一个更好的方法吗?
非常感谢任何关于 a) 和 b) 的提示和 cmets!
【问题讨论】: