fib2=: 13 :'0,%1+.(+%)/\y$1' fib2 9 0 1 1 2 3 5 8 13 21 34 fib2 0 , [: % 1 +. [: (+ %)/\ 1 $~ ]
This does not use $: Linda -----Original Message----- From: programming-boun...@forums.jsoftware.com [mailto:programming-boun...@forums.jsoftware.com] On Behalf Of Jose Mario Quintana Sent: Sunday, February 23, 2014 8:38 PM To: Programming forum Subject: [Jprogramming] Tacit recursion without $: Tacit recursion without $: Is there ever a case for tacit recursion without the use of the self-reference verb ($:)? One reason is if one wants to define and fix a tacit verb in terms of one or more tacit recursive verbs. The problem is that the official public version of J lacks the means to provide a direct scope for the recursion phrase containing the self-references. It is possible, but inefficient, to circumvent this problem by employing recursion without $:. This was the motivation for developing the recursion scope adverb (103!.0) extension [0,1]. Thus, this is no longer an issue when using a patched version of J. What about when writing mutually recursive anonymous verbs? One can even use $: to accomplish this using the recursion scope (103!.0). How? See, for example, hint/solution (a). A reasonably interesting test case is the implementation of the female and male sequences [7]. (See [1] to find where to get a suitable Windows J DDL version with recursion scope.) What about when writing recursive tacit adverbs since $: is only meant to self-refer verbs? The agenda form (@. N) where N is boxed is a fairly general, but often a cumbersome and only occasionally a convenient, scheme to write tacit adverbs. However, the (@. N) form is not necessary. An alternative way is via the adverb (Adv) in [2] that adverbializes a verb; see also the adverb (av) in [3] (or a similar adverb, for example, the permissive adverb (adv) defined in [1]). The generic defining sentence form is ((`'') (workhorse f.Adv) (`:6)) where workhorse is a tacit verb that takes the adverb's gerund as an argument and constructs the atomic representation of the desired word to be produced by the adverb (and any valid computable atomic representation can be produced, in principle, by a workhorse verb since tacit verbal programming is (Turing) complete). The burden of working with atomic representations can be mitigated by using heterodox wicked verbs that can take and produce any type of word (see, [1] and references there in) and the form is in this case simplified to (darkhorse f. Adv). There is one issue though, the agenda form (@. N) is used in the definition of the adverb (Adv)! However, the adverb (Adv) can be rewritten without using the agenda form. How? See, hint/solution (b). Thus, if a recursive method is well-advised, it could always be implemented in the definition of the workhorse, or the darkhorse, via $:. Therefore, there is never a case for recursion without the use of $: with just one type of exception (as far as I know). How come? The exception occurs when it is required because of syntactic reasons! What? Consider the following: One can write tacitly an adverb (Recursion) that reproduces the behavior of (`:4) described in [4]. (How? See hint/solution (c).) So that, fact=. *`1:`*`<: Recursion NB. Factorial fact 5 120 Fib=. >&1`(i.@>:)`(] , +/@(_2&{.)@])`<: Recursion NB. Fibonacci Fib 7 0 1 1 2 3 5 8 13 One can even produce an adverb (Recur) that that takes the arguments (Proposition, Basis, Combine, and Reduce) as a strand; this is a form pioneered by Dan (see, for example, [5,6]), fact=. * 1: * <: Recur NB. Factorial fact 5 120 Fib=. (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: Recur NB. Fibonacci Fib 7 0 1 1 2 3 5 8 13 Furthermore, one can even write a fixed adverb (sna) that takes as a strand (of course!) the atomic representation of any adverb, which takes a gerund (in the form of an argument list), and (sna) also takes the tally (#) of that gerund and produces a corresponding (fixed) adverb, which takes the arguments as a strand. How? The subject of this message implies the answer: recursively (without $:)! For more details see the hint/solution (d). For instance, the adverb (Recur) was defined as, ar=. 5!:1@< Recur=. (ar'Recursion') 4 sna NB. Recur is fixed automatically (Incidentally, although Recursion and Recur can produce a wide variety of recursive verbs, more complex recursive verbs, such as the recursive definition of the Ackermann function, do not seem to fit the (Proposition, Basis, Combine, and Reduce) mold. Am I mistaken?) Is there any benefit for defining adverbs in strand form (apart from allowing one to write neat expressions)? I think so: these expressions are, or should be, right-associative and provide flexible means to refer to the argument of a derived adverb, the argument of the derived adverb of a derived adverb, and so on; thus, one can easily bond adverb arguments. For example, often the Reduce recursion part is decrement (<:), so one can easily write an adverb (rd) that would accommodate those cases, rd=. <: Recur NB. rd is fixed automatically fact=. * 1: * rd fact 5 120 Fib=. (>&1) (i.@>:) (] , +/@(_2&{.)@]) rd Fib 7 0 1 1 2 3 5 8 13 Sometimes the order of the arguments of the source adverb might not be convenient for bonding. For the typical adverbs taking a gerunds, it is quite easy to derive a target adverb with an arbitrary permutation of the arguments: just adverbialize a permutation verb first; for example, ((P&{ Adv) Recursion) where P is an arbitrary permutation. It is not as easy to permute the arguments of adverbs taking strands. Yet, one can write a generic adverb Permute to derive a target adverb, which takes a list of arguments as a gerund, from a permutation verb and the (atomic representation of the) source adverb, which takes its arguments as a strand. The derived verb can in turn be easily converted to take its arguments as a strand. For example, recur=. (3 2 1 0&{) (ar'Recur') Permute 4 sna <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 recur=. |. (ar'Recur') Permute 4 sna <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 * 1: * <: Recur 5 120 * 1: * <: |.(ar'recur') Permute 4 sna 5 120 (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: Recur 7 0 1 1 2 3 5 8 13 (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: |.(ar'recur') Permute 4 sna 7 0 1 1 2 3 5 8 13 How can one write Permute? See hint/solution (e). [0] J functional programming extensions http://www.jsoftware.com/pipermail/programming/2013-March/031835.html [1] J Functional Programming Extensions http://journalofj.com/index.php/vol-2-no-2-october-2013 [2] Recursion http://www.jsoftware.com/pipermail/programming/2013-November/034177.html [3] Tacit adverbial programming patterns http://www.jsoftware.com/pipermail/programming/2013-February/031673.html [4] Gerunds and Representations http://www.snakeisland.com/gerunds.htm [5] How to make this conjunction tacit http://www.jsoftware.com/pipermail/programming/2013-October/033639.html [6] How to make this conjunction tacit http://www.jsoftware.com/pipermail/programming/2013-October/033654.html [7] Hofstadter's female and male sequences http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences The hints/solutions follow after the countdown: ,. @: |. @: i. 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NB. The following were referred as hints/solutions. They are solutions written using a NB. permissive extended version of J described in [1]; but, there are also hints because the NB. ideas could be applied to write solutions using an official version of J. Verbalized NB. primitive adverbs and conjunctions can be produced using an alternative definition for NB. Cloak (]:): Cloak=. (<(<,'4'),<(<(<,'4'),<;:'0:`'),<(<,'4'),<;:',^:') (0:`)(,^:). In NB. addition, tacit adverbs can replace derived tacit conjunctions which are not possible to NB. produce using the official version. Orthodox tacit solutions are, in principle, also NB. possible (with the virtual exception of (a)), but probably hard to write. As its name NB. implies, the orthodox solution to question (b) does not require any extensions. NB. NB. Moreover, for the law abiding explicit writers (if there are any still reading this far) NB. I do not see any reason why anonymous solutions could not be written explicitly; then NB. again, I do not write explicitly, what do I know? NB. The hints/solutions are presented slightly out of order ((a), (b), (d), (c) and (d)). NB. General preliminary pro-words... (ar=. 5!:1@<) (st=.7!:2@:] ; 6!:2) NB. Verbs 5!:1@< (7!:2@:] ; 6!:2) (o=. @:) NB. Conjunction @: (x=. o[) (y=. o]) (g=. "_1) (e=. &.>) (c=. "_) (f=. &{::) NB. Adverbs (((((o[)(o]))("_1))(&.>))("_))(&({::)) NB. (a) Mutual recursion.................................................................... pre=. o <: zip=. @.(0 = ]) NB. Odd/Even (first a classic simple example) NB. see http://en.wikipedia.org/wiki/Mutual_recursion NB. Using pro-verbs Even=. ( Odd pre)`1: zip Odd =. (Even pre)`0: zip (Even g ,: Odd g) o i. 11 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 NB. Anonymously using $: and recursion scope (103!:0) NB. The idea is to write the recursive verbs as agenda cases of a single encompassing NB. recursive verb. Even=. 0&oe Odd =. 1&oe ( oe=. ( ( Odd pre y)`1: zip)`((Even pre y)`0: zip) @. [ ) Odd@:<:@:]`1:@.(0 = ])`(Even@:<:@:]`0:@.(0 = ]))@.[ ( oe=. oe f. ) NB. Unfortunately, 1&oe@:<:@:]`1:@.(0 = ])`(0&oe@:<:@:]`0:@.(0 = ]))@.[ NB. Fixing oe manually, ( oe=. ( ( (1&$:) pre y)`1: zip)`(((0&$:) pre y)`0: zip) @. [ ) 1&$:@:<:@:]`1:@.(0 = ])`(0&$:@:<:@:]`0:@.(0 = ]))@.[ Even f. 0&(1&$:@:<:@:]`1:@.(0 = ])`(0&$:@:<:@:]`0:@.(0 = ]))@.[ (103!:0)) Odd f. 1&(1&$:@:<:@:]`1:@.(0 = ])`(0&$:@:<:@:]`0:@.(0 = ]))@.[ (103!:0)) (Even f.g ,: Odd f.g) o i. 11 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 NB. Female/Male sequences NB. http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences NB. Using pro-verbs female=. (] - male o (female pre))`1: zip M. male=. (] - female o (male pre))`0: zip M. (female f.g ,: male f.g) o i. 22 1 1 2 2 3 3 4 5 5 6 6 7 8 8 9 9 10 11 11 12 13 13 0 0 1 2 2 3 4 4 5 6 6 7 7 8 9 9 10 11 11 12 12 13 st'(female g ,: male g) o i. 222' ┌─────┬─────────┐ │19136│0.0159093│ └─────┴─────────┘ NB. Anonymously using $: and recursion scope (103!:0) NB. Again, the idea is to define the recursive verbs as agenda cases of a single NB. encompassing recursive verb. female=. 0&fm male=. 1&fm fm=. ((] - male o (female pre y))`1: zip)`((] - female o (male pre y))`0: zip) @. [ M. fm f. NB. Unfortunately, (] - 1&fm@:(0&fm@:<:@:]))`1:@.(0 = ])`((] - 0&fm@:(1&fm@:<:@:]))`0:@.(0 = ]))@.[M. NB. Fixing fm manually, fm=. ((] - (1&$:) o ((0&$:) pre y))`1: zip)`((] - (0&$:) o ((1&$:) pre y))`0: zip) @. [ M. male f. 1&((] - 1&$:@:(0&$:@:<:@:]))`1:@.(0 = ])`((] - 0&$:@:(1&$:@:<:@:]))`0:@.(0 = ]))@.[M. (103!:0)) female f. 0&((] - 1&$:@:(0&$:@:<:@:]))`1:@.(0 = ])`((] - 0&$:@:(1&$:@:<:@:]))`0:@.(0 = ]))@.[M. (103!:0)) (female f.g ,: male f.g) o i. 22 1 1 2 2 3 3 4 5 5 6 6 7 8 8 9 9 10 11 11 12 13 13 0 0 1 2 2 3 4 4 5 6 6 7 7 8 9 9 10 11 11 12 12 13 st'(female f.g ,: male f.g) o i. 222' ┌──────┬──────────┐ │155136│0.00219392│ └──────┴──────────┘ NB. There is a space-time tradeoff but the huge savings in space and time for NB. both versions come from the use of memoization (M.). NB. ........................................................................................ NB. Someone might think that in a permissive environment the rules for writing tacitly are NB. discarted. On the contrary, they are more relevant than ever and it is crucial to have NB. in mind one of my favorite generic rules, "Learn the rules so you know how to break them NB. properly." Why? Because the power emanating from the tacit rules of J is multiplied NB. when it is delivered at higher levels (where tacit rules were not supposed to operate). NB. General preliminary pro-words for programming wickedly... Cloak=. ]: NB. The monadic case is equivalent to, NB. Cloak=. (<(<,'4'),<(<(<,'4'),<;:'0:`'),<(<,'4'),<;:',^:') (0:`)(,^:) NB. Verbalizing all primitive adverbs and conjunctions (only a few are used in this session), ( (X=. 'power tilde dot even odd colon obverse adverse cut fit foreign slash slashdot back backdot trap brace rank tie knot evoke atop agenda at amper under dual appose') (;:x ,: ]) Y=. ;: '^: ~ . .. .: : :. :: ;. !. !: / /. \ \. ]. } " ` `. `: @ @. @: & &. &.: &:' ) ┌─────┬─────┬───┬────┬───┬─────┬───────┬───────┬───┬───┬───────┬─────┬────────┬────┬───────┬────┬─────┬────┬───┬────┬─────┬────┬──────┬──┬─────┬─────┬────┬──────┐ │power│tilde│dot│even│odd│colon│obverse│adverse│cut│fit│foreign│slash│slashdot│back│backdot│trap│brace│rank│tie│knot│evoke│atop│agenda│at│amper│under│dual│appose│ ├─────┼─────┼───┼────┼───┼─────┼───────┼───────┼───┼───┼───────┼─────┼────────┼────┼───────┼────┼─────┼────┼───┼────┼─────┼────┼──────┼──┼─────┼─────┼────┼──────┤ │^: │~ │. │.. │.: │: │:. │:: │;. │!. │!: │/ │/. │\ │\. │]. │} │" │` │`. │`: │@ │@. │@:│& │&. │&.: │&: │ └─────┴─────┴───┴────┴───┴─────┴───────┴───────┴───┴───┴───────┴─────┴────────┴────┴───────┴────┴─────┴────┴───┴────┴─────┴────┴──────┴──┴─────┴─────┴────┴──────┘ ( (X)=. ]: o < e Y ) NB. Verbalizing primitive adverbs and conjunctions ┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───... │(]:(<'^:'))│(]:(<,'~'))│(]:(<,'.'))│(]:(<'..'))│(]:(<'.:'))│(]:(<,':'))│(]:(<':.'))│(]:(<'::'))│(]:(<';.'))│(]:(<'!.'))│(]:(<'!:'))│(]:(<,'/'))│(]:(<'/.'))│(]:(<,'\'))│(]:(<'\.'))│(]:(<'].'))│(]:(<,'}'))│(]:(<,'"'))│(]:(<,'`'))│(]:(<'`.'))│(]:(<'`:'))│(]:... └───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───... ( (X=. 'bdot derivative Derivative secant fix hypergeometric LevelAt memo spread TaylorCoeff WeightedTaylor TaylorApprox') (;:x ,: ]) Y=. ;: 'b. d. D. D: f. H. L: M. S: t. t: T.' ) ┌────┬──────────┬──────────┬──────┬───┬──────────────┬───────┬────┬──────┬───────────┬──────────────┬────────────┐ │bdot│derivative│Derivative│secant│fix│hypergeometric│LevelAt│memo│spread│TaylorCoeff│WeightedTaylor│TaylorApprox│ ├────┼──────────┼──────────┼──────┼───┼──────────────┼───────┼────┼──────┼───────────┼──────────────┼────────────┤ │b. │d. │D. │D: │f. │H. │L: │M. │S: │t. │t: │T. │ └────┴──────────┴──────────┴──────┴───┴──────────────┴───────┴────┴──────┴───────────┴──────────────┴────────────┘ ( (X)=. ]: o < e Y ) NB. Verbalizing the rest of the primitive adverbs and conjunctions ┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐ │(]:(<'b.'))│(]:(<'d.'))│(]:(<'D.'))│(]:(<'D:'))│(]:(<'f.'))│(]:(<'H.'))│(]:(<'L:'))│(]:(<'M.'))│(]:(<'S:'))│(]:(<'t.'))│(]:(<'t:'))│(]:(<'T.'))│ └───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┘ ( train=. evoke&6 ) NB. train evoke&6 NB. Preliminary wicked pro-words... box=. < o train g f. NB. Boxing verbs from gerund ( an=. <@:((":0) ,&< ]) ) NB. Atomizing a noun <@:((,'0') ,&< ]) ( ew=. adverb ]: (ar'an') ) NB. Encasing a word (adv) (1]:(<(<'@:'),<(<,'<'),<(<,'3'),<(<<;._1 ' 0 0'),(<(<,'&'),<;:',<'),<,']')) ( ew=. adverb ]: an (f.ew) ) (1]:(<(,'0');<@:((,'0') ,&< ]))) ( af=. an o fix f.) NB. Atomizing after fixing (an alternative to atomic representations) <@:((,'0') ,&< ])@:(]:(<'f.')) ( wl=. 104!:1 ) NB. Word from linear (similar to Dan's dont) 104!:1 NB. These (verbalized primitive adverbs and conjunctions) operate as brain surgeons, NB. borrowing Dan's analogy [8], on conscious patients (verbs and nouns). Neither there is NB. a need to knock the arguments out into atomic representations (via `'') nor to wake them NB. up via a culminating train (`:6). NB. (b) Adv without (@. N).................................................................. NB. An orthodox way... ( a0=. `'' ) ( a1=. (@:[) ((<'&')`) (`:6) ) ( a2=. (`(an _)) (`:6) ) ((`'')(((@:[)(&`))(`:6)))((`_)(`:6)) (('a0'f.) (u a1) ('a2'f.)) ((`'')(&(u@:[)))((`_)(`:6)) ( Adv0=. ((ar'a0')`) (`(ar'a1')) (`(ar'a2') ) (`:6) ) (((`''`)(`(((@:[)(&`))(`:6))))(`((`_)(`:6))))(`:6) u Adv0 ((`'')(&(u@:[)))((`_)(`:6)) 1 2 3 % Adv0 NB. Testing... 1 0.5 0.333333 NB. A wicked way... ( Adv=. ((af'a0')`) (`(af'a1')) (`(af'a2') ) (`:6) ) (((`''`)(`(((@:[)(&`))(`:6))))(`((`_)(`:6))))(`:6) u Adv ((`'')(&(u@:[)))((`_)(`:6)) 1 2 3 % Adv NB. Testing... 1 0.5 0.333333 st e '1 2 3 % Adv0' ; '1 2 3 % Adv' NB. They look the same but they are not, ┌─────────────────┬─────────────────┐ │┌────┬──────────┐│┌────┬──────────┐│ ││6272│3.80344e_5│││5120│1.38856e_5││ │└────┴──────────┘│└────┴──────────┘│ └─────────────────┴─────────────────┘ NB. ........................................................................................ NB. adv and conj adverbs... ( adv=. 'ew'f. (adverb ]: adverb ((&]:) ew)) ) ( conj=. 'ew'f. (adverb ]: conjunction ((&]:) ew)) ) ((1]:(<(,'0');<@:((,'0') ,&< ])))(1]:(<(,'0');1&]:)))((1]:(<(,'0');<@:((,'0') ,&< ])))(1]:(<(,'0');2&]:))) Fetch=. (] ([ amper train y)(({::`'')c))e o i. f.adv NB. Word mnemonics 5 Fetch NB. Example use (see (c) below), ┌───────┬───────┬───────┬───────┬───────┐ │0&({::)│1&({::)│2&({::)│3&({::)│4&({::)│ └───────┴───────┴───────┴───────┴───────┘ NB. Strand forms... NB. (d) Gerund to strand adverb converter................................................... NB. Writing the adverb (sna) is a lot easier that one might think at first glance because, NB. due to the right-associativity property, one only has to write one adverb (sna) that NB. (using the number of arguments) collects the rest of the strand as a list (the NB. arguments, and the adverb to be converted) and evaluates this list as a train formed by NB. the (atomic representation of the) curtail (}:) and the tail ({:). NB. sna... C=. _2 NB. Counter position last=. 1 >: C f NB. Is the last word in the queue? dec=. <@:(<: o (C f)) C} ] NB. Decrementing the counter next=. {: train o , an o dec NB. Producing the next adverb eval=. train o ((an o }:) ; {:) NB. Evaluating an adverb form ( [: (an o }:) {: Train ) main=. (next`(eval o (C&}.)) @. last) o knot f.conj NB. knoting and reproducing itself and finally evaluating sna=. (af'main')&(train o ([ ,(an o (>:y ; [)))f.) adv NB. The (main) conjunction is referring indirectly to itself sna NB. It is fixed... (1]:(<(,'0');(<(,'0');(2]:(<(,'0');({: (]:(<'`:'))&6@:, <@:((,'0') ,&< ])@:(<@:(<:@:(_2&({::))) _2} ]))`((]:(<'`:'))&6@:(<@:((,'0') ,&< ])@:}: ; {:)@:(_2&}.))@.(1 >: _2&({::))@:(]:(<'`.')))))&((]:(<'`:'))&6@:([ , <@:((,'0') ,&< ])@:(>:@:] ; [))))) NB. ........................................................................................ NB. Sometimes the number of arguments of an adverb is variable. This case can be handled NB. using a sentinel. Both, sna and particularly sa, were inspired by [9]. Their anonymous NB. (fixed) recursive implementation is based on the classic trick (Gödelian self-reference, NB. Quines, u/y combinators): self reference and reproduction via indirect reference to a NB. self-representation; see also [10,11,12] and references there in. NB. sa... cap=. (<'[:') (train x -: ]) [ NB. Using cap ([:) as a sentinel main=. ({:y train o , an o knot)`(eval o }:y) @. cap f.conj NB. knoting and reproducing itself and finally evaluating sa=. (fix'main') (af'main') NB. The (main) conjunction is referring indirectly to itself sa NB. It is fixed... (2]:(<(,'0');({:@:] (]:(<'`:'))&6@:, <@:((,'0') ,&< ])@:(]:(<'`.')))`((]:(<'`:'))&6@:(<@:((,'0') ,&< ])@:}: ; {:)@:}:@:])@.((<'[:') ((]:(<'`:'))&6@:[ -: ]) [)))(<(,'0');(2]:(<(,'0');({:@:] (]:(<'`:'))&6@:, <@:((,'0') ,&< ])@:(]:(<'`.')))`((]:(<'`:'))&6@:(<... NB. Train... darkhorse=. (('train'(wl ew) (train x at ]) train o (([ , (;`'') , ])/))) f. u0`u1`u2`u3 template=. darkhorse f. adv NB. Arguments as a gerund train@:(u0 ; u1 ; u2 ; u3) [: u0 u1 u2 u3 Train=. (af'template') sa NB. Arguments as a strand train@:(u0 ; u1 ; u2 ; u3) NB. (c) Recursion (reproduces the behavior of (`:4))........................................ ( 'v0 v1 v2 v3 self'=. 5 Fetch ) NB. Verbs mnemonics ┌───────┬───────┬───────┬───────┬───────┐ │0&({::)│1&({::)│2&({::)│3&({::)│4&({::)│ └───────┴───────┴───────┴───────┴───────┘ ( $:`'' ( items=. box o (,~) ) v0`v1`v2`v3 ) NB. Verbs ┌──┬──┬──┬──┬──┐ │v0│v1│v2│v3│$:│ └──┴──┴──┴──┴──┘ sentence=. (v1 tie ([: v2 (self at v3) Train)) agenda v0 NB. v1 ` ( v2 $: @: v3 ) @. v0 [: v2 (self at v3) Train NB. is just a convenient (and more meaningful) way to write, train@:(v2 ; self at v3) ( darkhorse=. sentence o ($:`''&items) )v0`v1`v2`v3 v1`(v2 $:@:v3)@.v0 ( Recursion=. darkhorse f.adv ) NB. Recursion as a fixed adverb (1]:(<(,'0');((1&({::) (]:(<,'`')) (]:(<'`:'))&6@:(2&({::) ; 4&({::) (]:(<'@:')) 3&({::))) (]:(<'@.')) 0&({::))@:((,<'$:')&(<@:((]:(<'`:'))&6)"_1@:(,~))))) ( fact=. *`1:`*`<: Recursion ) NB. Factorial 1:`(* $:@:<:)@.* fact 5 120 ( Fib=. >&1`(i.@>:)`(] , +/@(_2&{.)@])`<: Recursion ) NB. Fibonacci i.@>:`((] , +/@(_2&{.)@]) $:@:<:)@.(>&1) Fib 7 0 1 1 2 3 5 8 13 NB. ........................................................................................ Recur=. (ar'Recursion') 4 sna NB. Recur is fixed automatically fact=. * 1: * <: Recur NB. Factorial fact 5 120 Fib=. (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: Recur NB. Fibonacci Fib 7 0 1 1 2 3 5 8 13 NB. Bonding... rd=. <: Recur NB. rd is fixed automatically fact=. * 1: * rd fact 5 120 Fib=. (>&1) (i.@>:) (] , +/@(_2&{.)@]) rd Fib 7 0 1 1 2 3 5 8 13 NB. (e) Permutations........................................................................ 'Proposition Basis Combine Reduction' (i."_ 0 &: ;:) 'Reduction Combine Basis Proposition' 3 2 1 0 NB. Typical adverb taking a gerund <:`*`1:`* (((3 2 1 0&{)Adv) Recursion) 5 120 tgv=. `:6 (*`1:`*`<:) (af'Recur') ga=. (af'tgv') 2 sna 1:`(* $:@:<:)@.* (<:`*`1:`*) (3 2 1 0&{adv) (af'Recur') ga 1:`(* $:@:<:)@.* afTemplate=. an o ([: an o ([: (0&{) ((af'adv')c) Train) ((an o (1&{))c) ((af'ga')c) Train) f.adv ( ( 3 2 1 0&{ adv ) (af'Recur' ) ( ga ) ) (1]:(<(,'0');3 2 1 0&{))((2]:(<(,'0');({: (]:(<'`:'))&6@:, <@:((,'0') ,&< ])@:(<@:(<:@:(_2&({::))) _2} ]))`((]:(<'`:'))&6@:(<@:((,'0') ,&< ])@:}: ; {:)@:(_2&}.))@.(1 >: _2&({::))@:(]:(<'`.'))))((<(,'0');(2]:(<(,'0');({: (]:(<'`:'))&6@:, <@:((,'0') ,&< ])@:... NB. template=. (3 2 1 0&{adv) (af'Recur') ga NB. recur=. (af'template') 4 sna NB. <: * 1: * recur 5 NB. <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 NB. NB. (3 2 1 0&{) ` (af'Recur') afTemplate NB. an o ([: an o ([: (0&{) ((af'adv')c) Train) ((an o (1&{))c) ((af'ga')c) Train) ((3 2 1 0&{)) ` (af'Recur') NB. recur=. (((3 2 1 0&{) ` (af'Recur')) afTemplate) 4 sna NB. recur=. ((3 2 1 0&{) (af'Recur') (af'afTemplate') 2 sna) 4 sna Permute=. (af'afTemplate') 2 sna recur=. (3 2 1 0&{) (ar'Recur') Permute 4 sna NB. Reversing the list os arguments, <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 recur=. |. (ar'Recur') Permute 4 sna NB. An equivalent direct way, <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 NB. Alternatively... recur=. (3 2 1 0&{) (af'Recur') Permute 4 sna <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 recur=. |. (af'Recur') Permute 4 sna <: * 1: * recur 5 120 <: (] , +/@(_2&{.)@]) (i.@>:) (>&1) recur 7 0 1 1 2 3 5 8 13 NB. Checking... * 1: * <: Recur 5 120 * 1: * <: |.(ar'recur') Permute 4 sna 5 120 (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: Recur 7 0 1 1 2 3 5 8 13 (>&1) (i.@>:) (] , +/@(_2&{.)@]) <: |.(ar'recur') Permute 4 sna 7 0 1 1 2 3 5 8 13 NB. [8] making a 'first' adverb tacit NB. http://www.jsoftware.com/pipermail/programming/2013-November/033914.html NB. [9] Third argument (was: avoid boxing with fills - ?) NB. http://www.jsoftware.com/pipermail/programming/2009-July/015541.html NB. [10] J Myths Puzzles (Last Spoiler) NB. http://www.jsoftware.com/pipermail/programming/2008-March/009915.html NB. [11] Tacit Programming in Action: A Decade of Experience (Slides 99-111) NB. http://www.2bestsystems.com/j/J_Conference_2012. All NB. [12] Y Combinator -- "the J way" NB. http://www.jsoftware.com/pipermail/programming/2012-June/028335.html ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm