With all that said, I should point out that
evolve=:[
is a better optimization.
And, with that in mind,
FB=: [
FT=: 1:
satisfies my original claim for this case.
This approach does suffer from the conceptual pain of FB being a
function where recur was not a function, but that's just the sort of
sacrifice you have to make when dealing with optimizations.
Thanks,
--
Raul
On Wed, Jan 17, 2018 at 9:10 PM, Raul Miller <[email protected]> wrote:
> Ah, I see what you are getting at (though now I am wondering why it
> worked so flawlessly when I was testing it - today it has not worked
> for me even once).
>
> But, yes: the next verb is not a function. Instead, its user must
> adopt a humpty dumpty mindset where doing the same thing with the same
> argument will sometimes but not always produces a different result.
>
> Still, we could do something like:
>
> crazy=:1 :0
> if.0=L.y do. 0;u y else.
> (-.0{::y); u 1{::y
> end.
> :
> if.0=L.y do. 0;x u y else.
> (-.0{::y); x u 1{::y
> end.
> )
>
> sane=: 1 :0
> if.0<L.y do.u 1{::y else. u y end.
> :
> if.0<L.y do.x u 1{::y else. x u y end.
> )
>
> FC=: ]sane
> FB=: next crazy
> FT=: NotMatch sane
>
> recur=: FC@(FB^:FT^:_)
>
> Which, I now believe, is what you were getting at.
>
> Thanks,
>
> --
> Raul
>
>
> On Wed, Jan 17, 2018 at 7:04 PM, Jose Mario Quintana
> <[email protected]> wrote:
>> Alright, (by playing mental block defense again) you want to extend the prank
>> a little longer. Why not? Nobody has complained yet; although someone had
>> an urgent need to unsubscribe to this forum recently. :)
>>
>> There you go again...
>>
>>> The tail recursive routine in the evolve you referenced was recur, and
>>> the FB^:FT^:_ form of recur would be:
>>
>>> recur=: next^:NotMatch^:_
>>
>>> I hope this helps,
>>
>>
>> The fuzzy claim [2] has one example. This is wonderful! The form of,
>>
>> recur=: next^:NotMatch^:_
>>
>> is beautyfully simple versus,
>>
>> recur=. ]`([ $: next)@.NotMatch
>>
>> I cannot wait to see it in action...
>>
>> NB. Fresh session
>>
>> JVERSION
>> Engine: j806/j64nonavx/windows
>> Release: commercial/2017-11-06T10:01:33
>> Library: 8.06.09
>> Qt IDE: 1.6.2/5.6.3
>> Platform: Win 64
>> Installer: J806 install
>> InstallPath: j:/program files/j
>> Contact: www.jsoftware.com
>>
>> CHARS =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>> mutation =: CHARS&(] ,: [ {~ $@] ?@$#@[)
>> fivePct =: 0.05 >: $ ?@$ 0:
>> randomize =: (fivePct f.)`(mutation f.)}
>> score =: +/@:~:"1
>> copy100 =: 100 $ ,:
>> NotMatch =: 1 - -:
>> initial =: CHARS ([ {~ ?@$&#~ ) [
>>
>> next =: ((i. <./)@:score { ]) randomize@:copy100@:]
>>
>> recur=. ]`([ $: next)@.NotMatch
>>
>> evolve=. recur initial
>>
>> evolve 'METHINKS IT IS LIKE A WEASEL'
>> METHINKS IT IS LIKE A WEASEL
>>
>> Yeah, that version converged to the target. So what?
>>
>> recur=: next^:NotMatch^:_
>>
>> evolve 'METHINKS IT IS LIKE A WEASEL'
>> METHITWH UA IS LZIE AIWKASEL
>>
>> Darn!
>>
>> However,
>>
>> recur=. ]`([ $: next)@.NotMatch
>>
>> often does not even give a wrong answer for some targets,
>>
>> evolve 'HOWEVER SOMETIMES IT MAY NOT WORK PROPERLY FOR SENTENCES OF
>> CERTAIN LENGTH'
>>
>> |stack error: randomize
>>
>> | evolve'HOWEVER SOMETIMES IT MAY NOT WORK PROPERLY FOR SENTENCES OF
>> CERTAIN LENGTH'
>>
>> What about that fork of J that Erling mentioned which supposedly has Tail
>> Call Optimization? Can that interpreter, so-called Jx really deal with
>> this target?
>>
>> tco=. O.1 NB. (Jx adv)
>>
>> CHARS =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>> mutation =: CHARS&(] ,: [ {~ $@] ?@$#@[)
>> fivePct =: 0.05 >: $ ?@$ 0:
>> randomize =: (fivePct f.)`(mutation f.)}
>> score =: +/@:~:"1
>> copy100 =: 100 $ ,:
>> NotMatch =: 1 - -:
>> initial =: CHARS ([ {~ ?@$&#~ ) [
>>
>> next =: ((i. <./)@:score { ]) randomize@:copy100@:]
>>
>> recur=. ]`([ $: next)@.NotMatch tco
>>
>> evolve=. recur initial
>>
>> evolve 'HOWEVER SOMETIMES IT MAY NOT WORK PROPERLY FOR SENTENCES OF
>> CERTAIN LENGTH'
>> HOWEVER SOMETIMES IT MAY NOT WORK PROPERLY FOR SENTENCES OF CERTAIN LENGTH
>>
>> Damn! It converged to the target.
>>
>> Nevermind, next^:NotMatch^:_ still is so beautiful and simple.
>>
>> ;)
>>
>> PS.
>>
>>> If F is something else,
>>> I guess I would have to do something else, also.
>>
>> Thank you for this superb explanation; it was so helpful, clear and
>> unambiguous.
>>
>> ;)
>>
>>
>> On Wed, Jan 17, 2018 at 11:43 AM, Raul Miller <[email protected]> wrote:
>>
>>> If you are expecting me to be perfect, I expect you are sadly mistaken.
>>>
>>> In related news, I don't see what you are trying to get at, here.
>>>
>>> Thanks,
>>>
>>> --
>>> Raul
>>>
>>>
>>> On Wed, Jan 17, 2018 at 11:03 AM, Jose Mario Quintana
>>> <[email protected]> wrote:
>>> > Pranks are usually performed (in the US) on April 1st :) The mental
>>> block
>>> > defense was a nice touch but it gave it away... Unable to recall what
>>> the
>>> > verb evolve does? A master of the J universe could not figure out what
>>> the
>>> > verb onemore does? Yeah, right!
>>> >
>>> > The lack of a single example of FB and FT, and the extensive obfuscating
>>> > taking including instances of I guess this, I guess that and I guess the
>>> > other was also a clue.
>>> >
>>> > As I said earlier in the thread: it has been somewhat entertaining. I
>>> had
>>> > a suspicion from the beginning because your "claim" in [2], not that [1]
>>> > makes more sense, reminded me of,
>>> >
>>> > Not even wrong
>>> > http://en.wikipedia.org/wiki/Not_even_wrong
>>> >
>>> >
>>> >> [1]
>>> >>
>>> >> If I have a tail recursive function F, which calls function G, there
>>> >> is normally no problem with G signaling that F needs to exit. Just
>>> >> return a distinguished value from G and in F have an if statement
>>> >> which returns when that happens. Since F is tail recursive, nothing
>>> >> more needs done.
>>> >>
>>> >> So I would like to see an example of how this description:
>>> >>
>>> >> >> I have a deeply embedded function that discovers that it has
>>> > completed the
>>> >> >> task set before it. ...
>>> >> >>
>>> >> >> This function was not part of the initial design.
>>> >>
>>> >> has anything to do with tail recursion.
>>> >>
>>> >> [2]
>>> >>
>>> >> If I have a recursive verb (F y) implemented in J, which satisfies the
>>> >> constraints for tail recursion, I believe that there is always a pair
>>> >> of companion functions (FB y) (FT y) such that an F workalike can be
>>> >> written:
>>> >>
>>> >> F=: FB^:FT^:_ y
>>> >>
>>> >> which satisfies the "bounded stack usage" guarantee of tail recursion.
>>> >> And this form has an additional advantage, which is that a rewrite
>>> >> which removes the bounded stack character requires work on the part of
>>> >> the developer which is quite significant - it's unlikely that you will
>>> >> have someone making such changes without realizing that they are doing
>>> >> so.
>>> >>
>>> >> But I would be interested in seeing a counter-example that destroys my
>>> >> belief, if counter examples exist.
>>> >
>>> >
>>> > PS. I am surprised you did not continue with your latest prank; it even
>>> > has a "quotation." :D
>>> >
>>> >
>>> >> The statement there, "Only one of these explanations is valid" is both
>>> >> unsupported and arguably false:
>>> >>
>>> >> 0 = 0 * 0
>>> >> 0 = 0 * 1
>>> >>
>>> >> This leads into some fairly deep issues in mathematics. It also has to
>>> >> do with the distinction between relations and functions with function
>>> >> domains with inverse functions, and with concepts of equality.
>>> >>
>>> >> Still, in functional contexts, this is also a real problem and it's
>>> >> entirely reasonable for a programming language or mathematical text to
>>> >> standardize on a single result.
>>> >
>>> >
>>> >
>>> >
>>> > On Tue, Jan 16, 2018 at 3:18 AM, Raul Miller <[email protected]>
>>> wrote:
>>> >
>>> >> On Tue, Jan 16, 2018 at 12:08 AM, Jose Mario Quintana
>>> >> <[email protected]> wrote:
>>> >> > First, you wrote,
>>> >> >> But I would be interested in seeing a counter-example that destroys
>>> my
>>> >> >> belief, if counterexamples exist.
>>> >> >
>>> >> > In your last message you wrote,
>>> >> >
>>> >> >> The use of FC is indeed necessary if the function being translated
>>> >> >> needs to be evaluated multiple times with the same arguments (in a
>>> >> >> single call).
>>> >> >
>>> >> > It seems that something has been accomplished: your belief has been
>>> >> > destroyed. But something might still be missing... I am playing the
>>> >> > devil's advocate now (no offense), you have not shown an actual
>>> >> > counterexample (F) refuting you fuzzy claim when "then function being
>>> >> > translated needs to be evaluated multiple times with the same
>>> arguments
>>> >> (in
>>> >> > a single call)."
>>> >>
>>> >> Yeah, ok.
>>> >>
>>> >> >> But I think this whole "moving target" label is really because of the
>>> >> >> nature of the generalizations we seem to be talking about.
>>> >> >
>>> >> > That seems to be a poor excuse. You could have included a formal
>>> >> > characterization of FC, FB and (now) FC in relation to F to clarify
>>> your
>>> >> > "claim"; unless, of course, that characterization is also fuzzy in
>>> your
>>> >> > mind.
>>> >>
>>> >> If F is a monadic verb which has a [meaningful] tail recursive
>>> >> optimization, FC@(FB^:FT^:_) is sufficient to represent F (and
>>> >> typically FC would be the identify function). If F is something else,
>>> >> I guess I would have to do something else, also.
>>> >>
>>> >> >> Also, ... you seem to be abandoning your previous "tail recursive"
>>> >> >> functions, rather than showing that they did anything. Was this your
>>> >> >> intent? Or are we coming back to them?
>>> >> >
>>> >> > Am I abandoning them? I seems you cannot grasp what the verb evolve
>>> does
>>> >> > despite the description of the task in the Rosetta Code site and
>>> >> > implementations in dozens of languages, including one in J. I am
>>> sorry,
>>> >> I
>>> >> > cannot help you there; however, certain author of a revision [0]
>>> might be
>>> >> > able to explain it to you, find "If you are getting lost" in [1]. ;)
>>> I
>>> >> > wonder why you apparently do not understand what the verb onemore is
>>> >> doing
>>> >> > either. :D
>>> >>
>>> >> Eh... the rosettacode evolve
>>> >>
>>> >> https://rosettacode.org/wiki/Evolutionary_algorithm#J
>>> >>
>>> >> is considerably different from the evolve you referenced earlier in this
>>> >> thread
>>> >>
>>> >> http://www.jsoftware.com/pipermail/programming/2009-December
>>> /017529.html
>>> >>
>>> >> Not only in structure, but in behavior.
>>> >>
>>> >> Though, reviewing this thread, I do now notice that you referred to
>>> >> the rosettacode instance a few messages back.
>>> >>
>>> >> Also, the rosettacode implementation of evolve already uses induction...
>>> >>
>>> >> But, anyways, that's enough hints for me to get going.
>>> >>
>>> >> The tail recursive routine in the evolve you referenced was recur, and
>>> >> the FB^:FT^:_ form of recur would be:
>>> >>
>>> >> recur=: next^:NotMatch^:_
>>> >>
>>> >> I hope this helps,
>>> >>
>>> >> --
>>> >> Raul
>>> >> ----------------------------------------------------------------------
>>> >> For information about J forums see http://www.jsoftware.com/forums.htm
>>> >>
>>> > ----------------------------------------------------------------------
>>> > For information about J forums see http://www.jsoftware.com/forums.htm
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm