<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2850382922506784765</id><updated>2011-07-07T21:16:32.442-07:00</updated><title type='text'>Grogix</title><subtitle type='html'>The first implementation of &lt;a href="http://www.bloominglogic.com"&gt;Blooming Logic&lt;/a&gt; [Patent Pending]</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-3500902114128669422</id><published>2010-03-30T01:01:00.000-07:00</published><updated>2010-03-31T17:59:15.834-07:00</updated><title type='text'>Interfaces and Productions</title><content type='html'>Grogix is Turing Complete -- these days, it seems to take special effort to create a language that isn't. A Grogix 'operational grammar' can produce the same results as the language in which it's implemented, and generally, the platform upon which it executes. After all, you can do &lt;span style="font-style:italic;"&gt;anything&lt;/span&gt; in the 'context interface', and write the grammar so that it gives back to the interface the permission to "do its thing". The programmer can then gradually transfer functional structure to the grammar, from the interface.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_d3u4MHOJotc/S7JBnOG1ABI/AAAAAAAAAN8/Qb5HEqpCErc/s1600/Picture+42.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 247px; height: 381px;" src="http://2.bp.blogspot.com/_d3u4MHOJotc/S7JBnOG1ABI/AAAAAAAAAN8/Qb5HEqpCErc/s400/Picture+42.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454494240756531218" /&gt;&lt;/a&gt;&lt;br /&gt;Since the 'context interface', or interface to the outside world, makes this unusual grammar into a fully functional machine, I'd like to reveal something more about of the general structure of interfaces:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_d3u4MHOJotc/S7JPG3USBqI/AAAAAAAAAOc/inQm4YQUv28/s1600/Picture+46.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 574px;" src="http://2.bp.blogspot.com/_d3u4MHOJotc/S7JPG3USBqI/AAAAAAAAAOc/inQm4YQUv28/s1600/Picture+46.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454509078045918882" /&gt;&lt;/a&gt;&lt;br /&gt;With the appropriate hooks in the traversal routine, the interface can determine a few other things about the handling of conditional productions. The notion of storage in the two presented Grogix programs, as well as the unusual meaning assigned to grammar and storage in the wiki_strings example, are just a few examples of the wide range of perfectly natural interpretations of productions in Grogix. &lt;br /&gt;&lt;br /&gt;Some notes on this topic:&lt;br /&gt;&lt;br /&gt;* There's no reason for the right-hand side of the production (which is sometimes called the successor) to be an ordered set or template of symbols and non-terminals. It could be unordered, generating combinations rather than permutations. This reflects certain ideas of the Minimalist Program in linguistics, for example the possibility that the "beads on a string" order (as opposed to the order of syntactical transformations) happens rather late in the production of speech (close to the sensorimotor interface). When we avoid left-to-right order in some productions, let's call them "unordered successors", we are clearly defining additional opportunities for parallel computations in the system.&lt;br /&gt;&lt;br /&gt;* There's no reason the core generated behavior needs to be a returned string. For example, the right-side or successor side of the production could be a series of commands, executed immediately or later. The production could use any set of symbols or media that has a meaning given to it by the interface. It is up to the interface traversing the grammar to interpret the right-side expression.&lt;br /&gt;&lt;br /&gt;* The operational grammar is not a 'grammar' in the particular sense that it is not about language syntax -- although it &lt;span style="font-style:italic;"&gt;can&lt;/span&gt; be used to represent language in the standard way. Grogix looks like a grammar, and has computational properties and logical operations, as all systems labeled 'grammatical' do, and so I call it a grammar. But someone could differ with my calling this a grammar, reasonably. On the other hand, I believe Grogix seems so useful exactly &lt;span style="font-style:italic;"&gt;because&lt;/span&gt; it has syntactic structure without referring to language, while at the same time being &lt;span style="font-style:italic;"&gt;itself&lt;/span&gt; a programming language.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-3500902114128669422?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/3500902114128669422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/interfaces-and-productions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/3500902114128669422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/3500902114128669422'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/interfaces-and-productions.html' title='Interfaces and Productions'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_d3u4MHOJotc/S7JBnOG1ABI/AAAAAAAAAN8/Qb5HEqpCErc/s72-c/Picture+42.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-8474382044274903623</id><published>2010-03-28T13:33:00.000-07:00</published><updated>2010-03-31T13:16:02.769-07:00</updated><title type='text'>Modularity within an Operational Grammar</title><content type='html'>In the previous example, I purposely left a fairly obvious section of "straight HTML" at the bottom of the grammar.&lt;br /&gt;&lt;br /&gt;The detail in this section could be turned into a grammar "module", shrinking the "core" grammar, making it more comprehensible.&lt;br /&gt;&lt;pre style="line-height:90%;"&gt;&lt;br /&gt;WikiBase.gx&lt;br /&gt;&lt;br /&gt;. start@ :: {{ wiki }}&lt;br /&gt;&lt;br /&gt;. wiki@url_name(page) :: {{wiki_page}}&lt;br /&gt;. wiki@url_name(edit) :: {{wiki_edit_page}}&lt;br /&gt;. wiki@ :: {{wiki_page}}&lt;br /&gt;&lt;br /&gt;. wiki_page@url_name(page) :: {{ html_page( *page, wiki_content(*page) ) }}&lt;br /&gt;. wiki_page@ :: {{ html_page( "WikiHome", wiki_content("WikiHome") ) }}&lt;br /&gt;&lt;br /&gt;. wiki_edit_page@ :: {{ html_page( *edit, wiki_edit ( *edit ) ) }}&lt;br /&gt;&lt;br /&gt;. wiki_content@ :: {{ wiki_top ($1) }} {{ wiki_text ($1) }} {{ edit_link ($1)}} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_edit@ :: {{ wiki_top ($1) }} {{ wiki_form ( wiki_text ) }} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_text@url_name(edit) :: {{ wiki_text.value }}&lt;br /&gt;. wiki_text@ :: {{ wiki_strings (wiki_text.value) }}&lt;br /&gt;&lt;br /&gt;. edit_link@ :: {{a_link ("/edit="+$1,"Edit "+$1)}}&lt;br /&gt;&lt;br /&gt;. wiki_strings@pattern("\&lt;[^&lt;&gt;]*\&gt;") ::&lt;br /&gt;. wiki_strings@pattern("([A-Z][a-z]+)+") :: {{ a_link("/page="+*1,*1) }}&lt;br /&gt;. wiki_strings@pattern("---+") :: {{ hr }}&lt;br /&gt;. wiki_strings@pattern("\*") ::  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#149;&lt;br /&gt;&lt;br /&gt;. wiki_top@ :: &amp;lt;div style="font-weight:bold;"&gt;{{ a_link( "/page="+$1, $1 ) }}&amp;lt;/div&gt;&lt;br /&gt;. wiki_footer@ :: copyright &amp;copy; {{*year}}&lt;br /&gt;&lt;br /&gt;. wiki_form@ :: &amp;lt;form action="/page={{*page}}" method="post"&gt;{{form_textarea(*page)}}{{form_button}}&amp;lt;/form&gt;&lt;br /&gt;&lt;br /&gt;. form_textarea@ :: &amp;lt;textarea name="{{*page}}"&gt;{{wiki_text}}&amp;lt;/textarea&gt;&lt;br /&gt;. form_button@ :: &amp;lt;input type="submit" name="button" value="save"&gt;&lt;br /&gt;&lt;br /&gt;... html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It seems like the next nearly modular sub-grammar is the wiki_strings section that handles the retrieval of string content. Obviously this section would be much larger in, say, the WikiMedia codebase. So it makes sense to abstract it away from the core grammar.&lt;br /&gt;&lt;pre style="line-height:90%;"&gt;&lt;br /&gt;WikiBase.gx&lt;br /&gt;&lt;br /&gt;. start@ :: {{ wiki }}&lt;br /&gt;&lt;br /&gt;. wiki@url_name(page) :: {{wiki_page}}&lt;br /&gt;. wiki@url_name(edit) :: {{wiki_edit_page}}&lt;br /&gt;. wiki@ :: {{wiki_page}}&lt;br /&gt;&lt;br /&gt;. wiki_page@url_name(page) :: {{ html_page( *page, wiki_content(*page) ) }}&lt;br /&gt;. wiki_page@ :: {{ html_page( "WikiHome", wiki_content("WikiHome") ) }}&lt;br /&gt;&lt;br /&gt;. wiki_edit_page@ :: {{ html_page( *edit, wiki_edit ( *edit ) ) }}&lt;br /&gt;&lt;br /&gt;. wiki_content@ :: {{ wiki_top ($1) }} {{ wiki_text ($1) }} {{ edit_link ($1)}} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_edit@ :: {{ wiki_top ($1) }} {{ wiki_form ( wiki_text ) }} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_text@url_name(edit) :: {{ wiki_text.value }}&lt;br /&gt;. wiki_text@ :: {{ wiki_strings (wiki_text.value) }}&lt;br /&gt;&lt;br /&gt;. edit_link@ :: {{a_link ("/edit="+$1,"Edit "+$1)}}&lt;br /&gt;&lt;br /&gt;. wiki_top@ :: &amp;lt;div style="font-weight:bold;"&gt;{{ a_link( "/page="+$1, $1 ) }}&amp;lt;/div&gt;&lt;br /&gt;. wiki_footer@ :: copyright &amp;copy; {{*year}}&lt;br /&gt;&lt;br /&gt;. wiki_form@ :: &amp;lt;form action="/page={{*page}}" method="post"&gt;{{form_textarea(*page)}}{{form_button}}&amp;lt;/form&gt;&lt;br /&gt;&lt;br /&gt;. form_textarea@ :: &amp;lt;textarea name="{{*page}}"&gt;{{wiki_text}}&amp;lt;/textarea&gt;&lt;br /&gt;. form_button@ :: &amp;lt;input type="submit" name="button" value="save"&gt;&lt;br /&gt;&lt;br /&gt;... wiki_strings&lt;br /&gt;... html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Although it doesn't shorten the core grammar much, moving the 3 lines of the edit form to its own module makes sense, given how complex an editor can become.&lt;br /&gt;&lt;pre style="line-height:90%;"&gt;&lt;br /&gt;WikiBase.gx&lt;br /&gt;&lt;br /&gt;. start@ :: {{ wiki }}&lt;br /&gt;&lt;br /&gt;. wiki@url_name(page) :: {{wiki_page}}&lt;br /&gt;. wiki@url_name(edit) :: {{wiki_edit_page}}&lt;br /&gt;. wiki@ :: {{wiki_page}}&lt;br /&gt;&lt;br /&gt;. wiki_page@url_name(page) :: {{ html_page( *page, wiki_content(*page) ) }}&lt;br /&gt;. wiki_page@ :: {{ html_page( "WikiHome", wiki_content("WikiHome") ) }}&lt;br /&gt;&lt;br /&gt;. wiki_edit_page@ :: {{ html_page( *edit, wiki_edit ( *edit ) ) }}&lt;br /&gt;&lt;br /&gt;. wiki_content@ :: {{ wiki_top ($1) }} {{ wiki_text ($1) }} {{ edit_link ($1)}} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_edit@ :: {{ wiki_top ($1) }} {{ wiki_form ( wiki_text ) }} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_text@url_name(edit) :: {{ wiki_text.value }}&lt;br /&gt;. wiki_text@ :: {{ wiki_strings (wiki_text.value) }}&lt;br /&gt;&lt;br /&gt;. edit_link@ :: {{a_link ("/edit="+$1,"Edit "+$1)}}&lt;br /&gt;&lt;br /&gt;. wiki_top@ :: &amp;lt;div style="font-weight:bold;"&gt;{{ a_link( "/page="+$1, $1 ) }}&amp;lt;/div&gt;&lt;br /&gt;. wiki_footer@ :: copyright &amp;copy; {{*year}}&lt;br /&gt;&lt;br /&gt;... wiki_edit&lt;br /&gt;... wiki_strings&lt;br /&gt;... html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What we're left with is, perhaps, what we'd expect from WikiBase: the large-scale structure of a web service with two dynamic web pages.&lt;br /&gt;&lt;br /&gt;I imagine clicking on an ellipsis (or hitting a key when it's highlighted) in order to see the sub-grammar. That sub-grammar of course will have its own module declarations etc.&lt;br /&gt;&lt;br /&gt;Note that this makes immediate opportunities for (1) standardized definitions for interaction with modules and (2) standardized modules.&lt;br /&gt;&lt;br /&gt;In a way, the grammar rather &lt;span style="font-style:italic;"&gt;forced&lt;/span&gt; us to do this. It's &lt;span style="font-style:italic;"&gt;slightly&lt;/span&gt; different from the way it forced us to separate the context from the grammar: the context interface became defined because the context wasn't part of the system derivation we focused on. That is, if you focus on the structure of a system, a context will always emerge that will make it easier to define the system grammatically. Modules are slightly different. In the process of deriving the system grammar, we notice sub-grammars that are quite modularized, even though they may be used pervasively by the grammar. We keep them in the grammar, but we put them aside. This is different from the context interface, which would be difficult to include in the grammar. It's really a matter of where you start. If we wrote a different grammar, with a focus on building a web &lt;span style="font-style:italic;"&gt;server&lt;/span&gt;, then the context interface would be different -- it would be the operating system. A wiki, or any web service, would be something so far down from a web server grammar, that it would be running inside a standardized module (the application container).&lt;br /&gt;&lt;br /&gt;I think it's a strength of this approach that, no matter where you start, it seems like you'll derive a rather similar layering of operational grammars. This is probably because we're focusing so intently on the structure of the &lt;span style="font-style:italic;"&gt;functionality&lt;/span&gt;: there is no reason to believe that the solutions would be very different.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-8474382044274903623?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/8474382044274903623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/modularity-within-operational-grammar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/8474382044274903623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/8474382044274903623'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/modularity-within-operational-grammar.html' title='Modularity within an Operational Grammar'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-7339915021713950467</id><published>2010-03-25T15:32:00.000-07:00</published><updated>2010-03-31T13:16:40.903-07:00</updated><title type='text'>Decimating the WikiBase</title><content type='html'>The Wiki was invented by a &lt;a href="http://www.c2.com"&gt;talented programmer&lt;/a&gt; who wanted to let his friends &lt;a href="http://www.c2.com/cgi/wiki?WelcomeVisitors"&gt;store patterns&lt;/a&gt; of software design modeled after &lt;a href="http://www.patternlanguage.com/"&gt;Christopher Alexander&lt;/a&gt;'s work in &lt;span style="font-style:italic;"&gt;A Pattern Language&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;The original Perl code is known as WikiBase, and after removing the HyperPerl structure, inspired by Donald Knuth's &lt;span style="font-style:italic;"&gt;Literate Programming&lt;/span&gt; ideas, the code runs to about: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;300 lines&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Below is a functionally equivalent Grogix program, which I wrote in about an hour, and which could be better, but runs to about:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;30 lines&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The difference is Grogix, not me. Operational Grammars compact the multiplicative effects in a system, and clarify system structures and their appropriate order of emergence. Real-world context is pushed into the interface, and all that remains is the unfolding structure. &lt;br /&gt;&lt;br /&gt;When looking at this example, please remember that an Operational Grammar represents a full executing system, not just the syntax of a language.&lt;br /&gt;&lt;br /&gt;In this example, I've made some changes from previous posts. &lt;br /&gt;&lt;br /&gt;1) The ellipses are gone, because people inferred that something was missing, which was not the case.&lt;br /&gt;&lt;br /&gt;2) I've marked the three parts of a Conditional Production with '@' and '::' :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;nonterminal@condition :: template&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) I've removed the keyword for the 'default' condition. So a default condition looks like:&lt;br /&gt;&lt;br /&gt;nonterminal@ :: text&lt;br /&gt;&lt;br /&gt;And of course the default condition goes at the end of any run of productions for the same nonterminal. They are evaluated in order.&lt;br /&gt;&lt;br /&gt;4) I also changed the right-hand side's {{nonterminal::parameter1,parameter2}} notation to {{ nonterminal( parameter1,parameter2 ) }}. These compose, so: {{ nonterminal1( parameter1, nonterminal2( parameter1, parameter2 ) ) }} ... note the productions access parameters with $1, $2 etc ... these will be name-able in the future.&lt;br /&gt;&lt;br /&gt;5) As before, every nonterminal is a potential persistent data type, where its access by .value triggers the persistence mechanism in the interface. &lt;br /&gt;&lt;br /&gt;The interface is somewhat different than in the previous example, allowing usages like the patterns-parsing of "wiki_strings" -- that's the strength of the interface-separation approach. New kinds of interface functionality can be added, but it's still a grammar, representing the structure of execution of a system.&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:90%;"&gt;&lt;br /&gt;WikiBase.gx&lt;br /&gt;&lt;br /&gt;. start@ :: {{ wiki }}&lt;br /&gt;&lt;br /&gt;. wiki@url_name(page) :: {{wiki_page}}&lt;br /&gt;. wiki@url_name(edit) :: {{wiki_edit_page}}&lt;br /&gt;. wiki@ :: {{wiki_page}}&lt;br /&gt;&lt;br /&gt;. wiki_page@url_name(page) :: {{ html_page( *page, wiki_content(*page) ) }}&lt;br /&gt;. wiki_page@ :: {{ html_page( "WikiHome", wiki_content("WikiHome") ) }}&lt;br /&gt;&lt;br /&gt;. wiki_edit_page@ :: {{ html_page( *edit, wiki_edit ( *edit ) ) }}&lt;br /&gt;&lt;br /&gt;. wiki_content@ :: {{ wiki_top ($1) }} {{ wiki_text ($1) }} {{ edit_link ($1)}} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_edit@ :: {{ wiki_top ($1) }} {{ wiki_form ( wiki_text ) }} {{ wiki_footer }}&lt;br /&gt;&lt;br /&gt;. wiki_text@url_name(edit) :: {{ wiki_text.value }}&lt;br /&gt;. wiki_text@ :: {{ wiki_strings (wiki_text.value) }}&lt;br /&gt;&lt;br /&gt;. edit_link@ :: {{a_link ("/edit="+$1,"Edit "+$1)}}&lt;br /&gt;&lt;br /&gt;. wiki_strings@pattern("\&lt;[^&lt;&gt;]*\&gt;") ::&lt;br /&gt;. wiki_strings@pattern("([A-Z][a-z]+)+") :: {{ a_link("/page="+*1,*1) }}&lt;br /&gt;. wiki_strings@pattern("---+") :: {{ hr }}&lt;br /&gt;. wiki_strings@pattern("\*") ::  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#149;&lt;br /&gt;&lt;br /&gt;. wiki_top@ :: &amp;lt;div style="font-weight:bold;"&gt;{{ a_link( "/page="+$1, $1 ) }}&amp;lt;/div&gt;&lt;br /&gt;. wiki_footer@ :: copyright &amp;copy; {{*year}}&lt;br /&gt;&lt;br /&gt;. wiki_form@ :: &amp;lt;form action="/page={{*page}}" method="post"&gt;{{form_textarea(*page)}}{{form_button}}&amp;lt;/form&gt;&lt;br /&gt;&lt;br /&gt;. form_textarea@ :: &amp;lt;textarea name="{{*page}}"&gt;{{wiki_text}}&amp;lt;/textarea&gt;&lt;br /&gt;. form_button@ :: &amp;lt;input type="submit" name="button" value="save"&gt;&lt;br /&gt;&lt;br /&gt;. a_link@ :: &amp;lt;a href="{{$1}}"&gt;{{$2}}&amp;lt;/a&gt;&lt;br /&gt;&lt;br /&gt;. hr@ :: &amp;lt;hr \&gt;&lt;br /&gt;. br@ :: &amp;lt;br \&gt;&lt;br /&gt;&lt;br /&gt;. html_page@ :: {{ html_header( $1 ) }} {{ html_body( $2 ) }}&lt;br /&gt;. html_header@ :: {{doctype}} &amp;lt;head&gt;&amp;lt;title&gt;{{ $1 }}&amp;lt;/title&gt;{{html_meta}}&amp;lt;/head&gt;&lt;br /&gt;. html_body@ :: &amp;lt;body&gt;{{ $1 }}&amp;lt;/body&gt;&lt;br /&gt;. html_meta@ :: &amp;lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&gt;&lt;br /&gt;. doctype@ :: &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are tools I'll build that should make this kind of programming even easier. I imagine an Eclipse plug-in that has two easily-switchable navigation modes: (1) scrolls around the whole grammar and (2) shows only the parent and child productions of whatever production your cursor is on. I'm guessing that this mode, with state discrimination added, could help expand the overlaid trees of conditional grammars, assisting our comprehension of even more complex systems, and producing a kind of "programming by borrowing" of grammar sub-trees ... anyway, much of the problem of navigating complex systems is mitigated by the one-grammar-per-system idea. It's a great model for portability, with a built-in idea for well-defined separation and integration between engine and interface. Additional systems (especially the interfaces) will have their own grammars too ... each layer in a real-world "interface stack" can be a system with its own operational grammar.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-7339915021713950467?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/7339915021713950467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/decimating-wikibase.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7339915021713950467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7339915021713950467'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/decimating-wikibase.html' title='Decimating the WikiBase'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-8274528440032635598</id><published>2010-03-21T20:21:00.000-07:00</published><updated>2010-03-21T21:21:52.787-07:00</updated><title type='text'>The Conditional Production</title><content type='html'>The primary notion in Grogix is the "extraction" of structure, or essence, or form, "from" the system being designed, and the "concentration" of that structure "into" the operational grammar, which executes the system.&lt;br /&gt;&lt;br /&gt;The basic construct that makes this possible is The Conditional Production. The typical grammar used for parsing will pair patterns with actions, which can be transformations. In contrast, the Conditional Production in the grammar only defines the non-terminal if the condition is met at run-time. This, along with the recursion found in any grammar, allows the definition of a single, finite grammar with infinite numbers of state combinations. Any programming language with iteration or recursion can do this, but only Grogix puts it into a single grammatical structure.&lt;br /&gt;&lt;br /&gt;Grogix's "hello world" example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;. start ... default ... hello world&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And a more complex version, making use of Conditional Productions:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;. start ... default ... hello {{name}}&lt;br /&gt;. name ... *user=="greg" ... mister G&lt;br /&gt;. name ... default ... {{*user}}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;"default" is the default or base condition. When a conditional expression that evaluates true is reached, moving from the top to the bottom of the list of productions, that production becomes active.&lt;br /&gt;&lt;br /&gt;In these examples, the far right, past the second ellipsis, is a text template, marked or escaped by these {{ call outs }} to further non-terminals or variable values.&lt;br /&gt; &lt;br /&gt;The *&lt;identifier&gt; construction represents an &lt;span style="font-style:italic;"&gt;interface&lt;/span&gt; variable. &lt;br /&gt;&lt;br /&gt;The grammar runs within an interface, and the grammar has various ways of receiving values from the interface. The interface here is not defined, making the grammar a kind of operational idealization, which can be used with multiple interfaces. One interface that we can imagine for these examples is a terminal program which has the user's login name available to it, which it then provides to the grammar. The grammar exits when the tree is fully traversed. We could imagine the interface then provides this result to the user, and quits. We could also imagine the exact same grammar for a web-based terminal service. A grammar can be written to remain abstract from such considerations, making it ideal for portability, or insertion into legacy situations. It could be also contain layers of sets of productions specifically written to deal with the outside world beyond more transparent interfaces, and these layers might be swapped out for different outside contexts.&lt;br /&gt;&lt;br /&gt;None of this would make much sense without the key idea of a central grammar executing the system. With Grogix, and Blooming Logic, one has to think of grammars differently, as the central organizing notation for &lt;span style="font-style:italic;"&gt;computation&lt;/span&gt;, rather than as a tool for defining language syntax.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-8274528440032635598?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/8274528440032635598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/conditional-production.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/8274528440032635598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/8274528440032635598'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/conditional-production.html' title='The Conditional Production'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-502000657347940431</id><published>2010-03-15T10:26:00.001-07:00</published><updated>2010-03-28T15:26:52.994-07:00</updated><title type='text'>Depth and Innate Judgements</title><content type='html'>&lt;span style="font-style:italic;"&gt;This post was moved to the &lt;a href="http://chomskyalexander.blogspot.com"&gt;Chomsky &amp; Alexander&lt;/a&gt; blog, along with future posts about Grogix that are strictly philosophical in nature.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-502000657347940431?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/502000657347940431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/depth-and-innate-judgements_15.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/502000657347940431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/502000657347940431'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/depth-and-innate-judgements_15.html' title='Depth and Innate Judgements'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-7120495536887669825</id><published>2010-03-09T00:57:00.000-08:00</published><updated>2010-03-14T17:55:27.679-07:00</updated><title type='text'>Grammar-centric programming</title><content type='html'>Let's look at a small Grogix example. Grogix stands for "GRammar-Operated General information computing system"&lt;br /&gt;&lt;br /&gt;Again, the notion is to keep the &lt;span style="font-style:italic;"&gt;entire&lt;/span&gt; system coherent through a &lt;span style="font-style:italic;"&gt;single&lt;/span&gt;, central grammar.&lt;br /&gt;&lt;br /&gt;Around the grammar is an &lt;span style="font-weight:bold;"&gt;interface&lt;/span&gt; to the world. The interface allows the recursive traversal procedure, the one that interprets the grammar, to drive action outside, and receive state-change information from the outside.&lt;br /&gt;&lt;br /&gt;This particular interface is a Python program, acting as both a Grogix interpreter, and as a liaison with the Google App Engine framework.&lt;br /&gt;&lt;br /&gt;Here's a Grogix grammar for a simple wiki:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;. start ... start ... {{default_page}}&lt;br /&gt;. default_page ... default ... {{page_contents}}&lt;br /&gt;&lt;br /&gt;. page_contents ... name_value(page) ... {{content_section}}&lt;br /&gt;. page_contents ... name_value(site) ... {{page_section}}&lt;br /&gt;. page_contents ... default ... {{site_section}}&lt;br /&gt;&lt;br /&gt;. site_section ... no_item(site) ... {{site_cycle}}&lt;br /&gt;. site_section ... default ... List of Sites: {{sites}}{{br}}{{site_cycle}}{{br}}{{br}}{{br}}{{hr}}{{br}}&lt;br /&gt;&lt;br /&gt;. sites ... default ... {{sites:site}} {{br}} &amp;lt;a href=&amp;quot;/site={{site.name}}&amp;quot;&amp;gt; {{site.name}}&amp;lt;/a&amp;gt; : {{site.value}}&lt;br /&gt;. site_cycle ... post ... {{site_cycle_post_response}}&lt;br /&gt;. site_cycle_post_response ... name_value(add) ... success&lt;br /&gt;. site_cycle ... get ... {{site_cycle_get_response}}&lt;br /&gt;. site_cycle_get_response ... name_value(action) ... {{standard_form}}&lt;br /&gt;. site_cycle_get_response ... default ... &amp;lt;a href=&amp;quot;/action=add&amp;amp;item=site&amp;quot;&amp;gt;Add a site&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;. page_section ... no_item(page) ... Site: {{*site}}{{br}}{{page_cycle}}&lt;br /&gt;. page_section ... default ... &amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Back to site overview&amp;lt;/a&amp;gt;{{br}}Pages:{{pages}}{{br}}{{page_cycle}}{{br}}{{br}}{{br}}{{hr}}{{br}}&lt;br /&gt;&lt;br /&gt;. pages ... default ... {{pages:page}} {{br}} -&amp;gt; &amp;lt;a href=&amp;quot;/site={{*site}}&amp;amp;page={{page.name}}&amp;quot;&amp;gt;{{page.name}}&amp;lt;/a&amp;gt; : {{page.value}}&lt;br /&gt;. page_cycle ... post ... {{page_cycle_post_response}}&lt;br /&gt;. page_cycle_post_response ... name_value(add) ... success&lt;br /&gt;. page_cycle ... get ... {{page_cycle_get_response}}&lt;br /&gt;. page_cycle_get_response ... name_value(action) ... {{standard_form}}&lt;br /&gt;. page_cycle_get_response ... default ... &amp;lt;a href=&amp;quot;/site={{*site}}&amp;amp;action=add&amp;amp;item=page&amp;quot;&amp;gt;Add a page&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;. content_section ... no_item(content) ... Page: {{*page}}{{br}}{{content_cycle}}'&lt;br /&gt;. content_section ... default ... &amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Back to site overview&amp;lt;/a&amp;gt;{{br}}Content:{{contents}}{{br}}{{content_cycle}}{{br}}{{br}}{{br}}{{hr}}{{br}}&lt;br /&gt;&lt;br /&gt;. contents ... default ... {{contents:content}} {{br}} {{content.name}} {{br}} &amp;lt;b&amp;gt;{{content.value}}&amp;lt;/b&amp;gt;&lt;br /&gt;. content_cycle ... post ... {{content_cycle_post_response}}&lt;br /&gt;. content_cycle_post_response ... name_value(add) ... success&lt;br /&gt;. content_cycle ... get ... {{content_cycle_get_response}}&lt;br /&gt;. content_cycle_get_response ... name_value(action) ... {{standard_form}}&lt;br /&gt;. content_cycle_get_response ... default ... &amp;lt;a href=&amp;quot;/site={{*site}}&amp;amp;page={{*page}}&amp;amp;action=add&amp;amp;item=content&amp;quot;&amp;gt;Add content&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;. standard_form ... default ... &amp;lt;form action=&amp;quot;{{form_target}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; {{form_name_textarea}}{{form_value_textarea}}{{standard_form_button}}{{form_hiddens}}&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;. form_name_textarea ... default ... name: &amp;lt;textarea style=&amp;quot;height:30px;width:300px;background:#eeee00;&amp;quot; name=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;{{br}}&lt;br /&gt;&lt;br /&gt;. form_value_textarea ... default ... value: &amp;lt;textarea style=&amp;quot;height:30px;width:300px;background:#eeee00;&amp;quot; name=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;{{br}}&lt;br /&gt;&lt;br /&gt;. standard_form_button ... default ... &amp;lt;span align=&amp;quot;left&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;Submit&amp;quot; name=&amp;quot;button&amp;quot; value=&amp;quot;{{standard_form_button_text}}&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;. form_target ... add(site) ... /action=add&amp;amp;item=site&lt;br /&gt;. form_target ... add(page) ... /site={{*site}}&amp;amp;action=add&amp;amp;item=page&lt;br /&gt;. form_target ... add(content) ... /site={{*site}}&amp;amp;page={{*page}}&amp;amp;action=add&amp;amp;item=content&lt;br /&gt;&lt;br /&gt;. form_hiddens ... default ... {{fh::&amp;quot;landing_site&amp;quot;,*site}} {{fh::&amp;quot;next_start&amp;quot;,&amp;quot;start&amp;quot;}} {{fh::&amp;quot;landing_page&amp;quot;,*page}}&lt;br /&gt;&lt;br /&gt;. fh ... default ... &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;{{$1}}&amp;quot; value=&amp;quot;{{$2}}&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;. standard_form_button_text ... add(site) ... Add Site&lt;br /&gt;. standard_form_button_text ... add(page) ... Add Page&lt;br /&gt;. standard_form_button_text ... add(content) ... Add Content&lt;br /&gt;&lt;br /&gt;. br ... default ... &amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;. hr ... default ... &amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, what are you looking at here?&lt;br /&gt;&lt;br /&gt;It's a grammar. You can see the "start" non-terminal at the beginning.&lt;br /&gt;&lt;br /&gt;It's an ordered set of non-terminal productions. You can see the non-terminal on the left is defined by the phrase on the right ... and the phrase on the right is clearly a text-based template ... the production is 'guarded' by a conditional clause between the non-terminal and the template-like phrase:&lt;br /&gt;&lt;br /&gt;. [non-terminal] ... [conditional] ... [defining phrase]&lt;br /&gt;&lt;br /&gt;The reason I precede each production with a "dot", is that I like to have free comments, to explain what is going on. This is a nod to Donald Knuth's important observations regarding Literate Programming.&lt;br /&gt;&lt;br /&gt;The ordered conditionals determine which productions are followed at run-time.&lt;br /&gt;&lt;br /&gt;The defining production itself has further non-terminal references in {{ braces }}.&lt;br /&gt;&lt;br /&gt;The productions can also inherit attributes passed from (or bequeathed by) its parent production, which uses this construction: {{ nt :: 'literal', *interface_value, $[inherited_value] }}.&lt;br /&gt;&lt;br /&gt;The productions can use information directly from the interface, and can modify interface values, including where the interface should "start" in the grammar on various occasions.&lt;br /&gt;&lt;br /&gt;There's an assumed general data-type which associates with a non-terminal, and can be assigned values. It is wound and unraveled with the {{sites:site}} recursive construction, with constraints selected in this way {{contents : content [site,page] }}, where site and page are in this case constraints on the data by those values, passed from the interface.&lt;br /&gt;&lt;br /&gt;Note that this was my &lt;span style="font-weight:bold;"&gt;first&lt;/span&gt; working version ... the program itself can obviously be shortened considerably to achieve the same end (there's a repetition I was using while debugging some properties of the interpreter ... discovering this is perhaps a useful exercise for the reader). In any case, in my next installment, I'll show a better grogix grammar for a wiki closer in definition to the &lt;a href="http://downlode.org/Wiki/wiki"&gt;original&lt;/a&gt;, and deploy the grammar-driven Google App Engine online, so people can try it for themselves.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-7120495536887669825?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/7120495536887669825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/grammar-centric-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7120495536887669825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7120495536887669825'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/grammar-centric-programming.html' title='Grammar-centric programming'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-5729868770712147846</id><published>2010-03-08T22:58:00.000-08:00</published><updated>2010-03-10T16:17:03.628-08:00</updated><title type='text'>Grogix: the GRammar-Operated General information computing system</title><content type='html'>I'm motivated by the &lt;span style="font-style:italic;"&gt;vast&lt;/span&gt; chasm between the products of human engineering and those of the biological world.&lt;br /&gt;&lt;br /&gt;I mentioned this &lt;a href="http://workingclouds.blogspot.com/2008/11/passing-keys.html"&gt;here&lt;/a&gt;. I'm using the techniques in Christopher Alexander's &lt;span style="font-style:italic;"&gt;The Nature of Order&lt;/span&gt;, that is, using &lt;span style="font-style:italic;"&gt;feeling&lt;/span&gt; as a test procedure. The test procedure uncovers what has strong biological coherence, and what doesn't. It is analogous to Noam Chomsky's linguistic test procedure, to determine what is, and what is not, part of the human faculty of language. The Alexandrian version of the Chomsky approach, has helped me to find a &lt;span style="font-style:italic;"&gt;strong&lt;/span&gt; notation, one that can actually give us a comfortable, natural, humane encoding for systems with the mind-boggling complexity of natural organisms.&lt;br /&gt;&lt;br /&gt;At the center of Alexander's current approach is the notion of &lt;span style="font-style:italic;"&gt;coherence&lt;/span&gt;. Some fields of centers ('centers' are things with a field-like property, without necessarily having a distinct boundary) work together, and support each other, holistically, with different degrees of coherence. &lt;br /&gt;&lt;br /&gt;I considered what it was that best &lt;span style="font-style:italic;"&gt;held&lt;/span&gt; everything together coherently, at least for me, in a computing system. And I know it sounds trite, but it seems that I &lt;span style="font-style:italic;"&gt;always&lt;/span&gt; come back to the idea that a &lt;span style="font-style:italic;"&gt;grammar&lt;/span&gt; defines the system -- it's kin to Aristotle's loosely-hierarchical &lt;span style="font-style:italic;"&gt;formal cause&lt;/span&gt;, the essence of a thing, which still works to describe structure everywhere in the universe.&lt;br /&gt;&lt;br /&gt;Now, even though programming systems &lt;span style="font-style:italic;"&gt;always&lt;/span&gt; seem to have some holistic grammatical properties, for some reason we never &lt;span style="font-style:italic;"&gt;express&lt;/span&gt; them grammatically. We express them as categories, functions, sets, classes, statements etc. But the only system that actually looks and &lt;span style="font-style:italic;"&gt;feels&lt;/span&gt; like the grammar of language, is the attribute-grammar toolset of YACC, and its derivatives.&lt;br /&gt;&lt;br /&gt;For decades, I've said to myself: "why do we only use grammars at the input and the output of a system?" We know from various kinds of re-writing systems (L-systems and Markov algorithms) that grammars are very powerful computationally. As a consequence of Chomsky's linguistics work, it's clear that various kinds of deep grammar &lt;span style="font-style:italic;"&gt;must&lt;/span&gt; be at the core of our natural enumerative capacity. So, why are we using functional notation, or trivial imperative notation, when &lt;span style="font-weight:bold;"&gt;grammar&lt;/span&gt; is actually the heart of the &lt;span style="font-style:italic;"&gt;form&lt;/span&gt; of a system?&lt;br /&gt;&lt;br /&gt;I also take to heart Feyerabend's prescription for progress: we've been incrementally building a body of doctrine about programming language semantics, in part to maintain logical consistency in the face of engineering demands -- yet we seem no closer to bridging the chasm between ourselves and nature. Maybe we need to  throw out our carefully-constructed mathematical deductions. Maybe we need to dig more deeply, not just into what nature is doing, not just into what mathematics calls for, but into what &lt;span style="font-style:italic;"&gt;we&lt;/span&gt; do best, mentally, as natural organisms. Our mathematical and symbolic ability is a consequence of our faculty of language. What could be more natural than putting language at the center?&lt;br /&gt; &lt;br /&gt;So &lt;span style="font-style:italic;"&gt;grogix&lt;/span&gt;: a grammar-&lt;span style="font-weight:bold;"&gt;operated&lt;/span&gt; general information computing system. The grammar is the &lt;span style="font-weight:bold;"&gt;heart&lt;/span&gt; of the system. You can have other systems. But if you want a &lt;span style="font-weight:bold;"&gt;coherent&lt;/span&gt; system, it must have &lt;span style="font-weight:bold;"&gt;one grammar&lt;/span&gt;, explicitly, facilitated and protected, at its heart.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-5729868770712147846?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/5729868770712147846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/grogix-grammar-operated-general.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/5729868770712147846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/5729868770712147846'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/grogix-grammar-operated-general.html' title='Grogix: the GRammar-Operated General information computing system'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-6870708704391507452</id><published>2010-03-08T22:41:00.000-08:00</published><updated>2010-03-08T22:57:12.132-08:00</updated><title type='text'>Grogix 0.2</title><content type='html'>Since October of 2009, I was forced to take grogix in a new direction. The old direction was, essentially, a macro preprocessor for generating programs ... albeit one with a well-integrated notion of grammar, morphogenetic sequences, pattern-like steps in those sequences, etc. It's still a useful authoring tool for the kind of analysis described in the sample sequence at &lt;a href="http://www.corememory.org"&gt;www.corememory.org&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;But I began to realize: no matter how natural or well-motivated or well-described, a hierarchical expression of the form of a generated Python program was &lt;span style="font-weight:bold;"&gt;not&lt;/span&gt; going to make me happy. I'm just too unsatisfied with our current programming paradigm, which always puts logical consistency before all else, despite the fact that logical consistency has become so straightforward and commonplace that young programmers can create turing complete notations without even knowing that they are doing so.&lt;br /&gt;&lt;br /&gt;So, one-by-one, I took parts of grogix-the-macro-processor which I felt were natural and well-motivated, and integrated them into grogix-the-programming language.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-6870708704391507452?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/6870708704391507452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2010/03/grogix-02.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/6870708704391507452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/6870708704391507452'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2010/03/grogix-02.html' title='Grogix 0.2'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-4411396678751295878</id><published>2009-09-30T15:47:00.000-07:00</published><updated>2009-10-02T16:43:36.446-07:00</updated><title type='text'>Mux-Demux: Coherence in Massive Generative Grammars</title><content type='html'>In the previous post, Grogix, our language for describing an operational sequence of patterns ordered by importance, was given a language structure, "mux-demux", to provide notational equivalence to the &lt;span style="font-style:italic;"&gt;multiple&lt;/span&gt; application of functions. But more is needed: the &lt;span style="font-style:italic;"&gt;higher-order function&lt;/span&gt;, where each of the multiple applied functions contains further functions. Our issue is that we still want these sub-functions to be disentangled, unraveled and transparent, so their patterns cannot be hidden, making them available for application globally to our system, so that true minimization of principles and patterns can be possible.&lt;br /&gt;&lt;br /&gt;In order to facilitate "higher-order mux-demux", we're going to extend the .demux directive, and turn it into a production. From our previous example (note that templates have step-only local scope):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.step 11 : 'db section'&lt;br /&gt;&lt;br /&gt;.template : 'db' : 'NAME'&lt;br /&gt;&lt;&lt;&lt;&lt;br /&gt;Class NAME (db.model):&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;.demux : 'db declarations'&lt;br /&gt;.nt: this&lt;br /&gt;.dnt: 'db references'&lt;br /&gt;&lt;br /&gt;.dmP: 'main page'&lt;br /&gt;.t : db ( 'Main' )&lt;br /&gt;&lt;br /&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, in a later pattern/step, a further .demux reference to 'db references' will be applied to a spot after each of the .dmP results at this step.&lt;br /&gt;&lt;br /&gt;This provides a kind of "multiplexing trunk', where demultiplexing of the original group is done at any number of steps in the morphogenesis of the system.&lt;br /&gt;&lt;br /&gt;But we need two more things to complete our analogy with everyday class and functions use:&lt;br /&gt;&lt;br /&gt;(1) A way to merge mux groups.&lt;br /&gt;(2) A way to split mux groups.&lt;br /&gt;&lt;br /&gt;(1) is easy, and 'free' in my implementation, requiring no new syntax. We simply use the .demux target in more than one .mux statement.&lt;br /&gt;&lt;br /&gt;(2) requires new syntax. We attach 'directed non-terminal' .dnt directives to .dmP's, in a .demux block, not just to .mP's in a .mux block.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.dmP: 'main page'&lt;br /&gt;.t : db ( 'Main' )&lt;br /&gt;.dnt : 'page db declarations'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This tags the production for a later &lt;span style="font-weight:bold;"&gt;.demux: 'page db declarations'&lt;/span&gt; directive ... other .dmP's at this level can be so tagged, splitting the mux group, allowing for differentiation of streams of otherwise similar elements. Clearly something like this is done in nature ... and we certainly need it in order to reduce notation, while maintaining global transparency.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-4411396678751295878?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/4411396678751295878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/09/tree-of-demultiplexers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/4411396678751295878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/4411396678751295878'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/09/tree-of-demultiplexers.html' title='Mux-Demux: Coherence in Massive Generative Grammars'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-923755554179408442</id><published>2009-09-30T12:37:00.000-07:00</published><updated>2009-09-30T14:43:59.637-07:00</updated><title type='text'>Rethinking the fundamental aspects of functions</title><content type='html'>A Class is a "minimizing" tool, a shorthand for otherwise impossibly repetitive, incomprehensible and error-prone declarations of methods and data.&lt;br /&gt;&lt;br /&gt;Functions fall into the same category, as do global data declarations: with them, we create a necessary shorthand. We resolve nagging details within functions, so we can move on, and think larger thoughts. Functions reflect the compression we perform naturally, while we think, and while we express our thoughts.&lt;br /&gt;&lt;br /&gt;There is, however, a problem with large, intertwined libraries, frameworks and cultures of shorthand.&lt;br /&gt;&lt;br /&gt;One problem is that, in applying existing Libraries and Functions to a new problem, or a new set of goals, you can't find the important features of your new set in a natural way ... natural either to the problem at hand or to your deepest thoughts about it. Instead, you need to think of it in terms of the machine, and the culture of using the machine represented by the Libraies and Functions, Classes and Methods ... &lt;br /&gt;&lt;br /&gt;What you want to do, to quote Plato (from the frontispiece of Christopher Alexander's "Notes on a Synthesis of Form"):&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;" ... the separation of the Idea into parts, by dividing it at the joints, as nature directs, not breaking any limb in half as a bad carver might ..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have always felt that, while there are important ideas hidden in these libraries, they have a tendency to "chop up" the problem you're working on in a most unnatural way. Some are a better fit to your problem than others, to be sure. But there is something fundamentally wrong about &lt;span style="font-style:italic;"&gt;how&lt;/span&gt; we apply this existing work to our own problems.&lt;br /&gt;&lt;br /&gt;Mathematicians have understood the difference for centuries: the application of known results to new problems is either done well, and naturally, unfolding beautifully for the reader of the proof, or else it is hacked together: possibly correct, but unreadable. There needs to be a &lt;span style="font-style:italic;"&gt;plot&lt;/span&gt;, a &lt;span style="font-style:italic;"&gt;gradient&lt;/span&gt; of applied resolutions bearing down on the problem.&lt;br /&gt;&lt;br /&gt;What I want to do with Grogix, is make it easy to create this gradient. But to do so, we need to think differently about Functions and Classes. &lt;br /&gt;&lt;br /&gt;Functions are shorthand, and collected together make a kind of fantasy world. But they represent the fantasy world of an operating computer ... so there is utility in cooperating with it. Yes, the fantasy world collapses when you hit it with a  sledgehammer. But it also contacts a billion people when you use it well.&lt;br /&gt;&lt;br /&gt;The RNA-&gt;DNA-&gt;protein mechanisms of nature &lt;span style="font-style:italic;"&gt;could&lt;/span&gt; also be called a fantasy logical system ... boil a cell, and the machinery disappears. But there is great power in this machinery. In fact the point of the present work is to find a natural way to use an analogy to morphogenesis as a means of cooperating with computing systems.&lt;br /&gt;&lt;br /&gt;Let's look at one particular aspect of functions: functions that call functions, or &lt;span style="font-style:italic;"&gt;higher-order function&lt;/span&gt;. In Object-Oriented Design, these are methods that call other methods or classes. They are pervasive in computing. Every programmer uses them constantly.&lt;br /&gt;&lt;br /&gt;One of the consequences of higher-order functions is a kind of cascading effect, or a "tree of applied functions" that are called anytime one is used. &lt;br /&gt;&lt;br /&gt;But say we want this tree to be &lt;span style="font-style:italic;"&gt;explicit&lt;/span&gt;? Say I'd like every program I write to "show its work", and also to "minimize all higher-order functions" by eliminating buried functional similarities?&lt;br /&gt;&lt;br /&gt;Why would I want to do this? So we could write more reliable, robust, and natural programs. If we can disentangle the trees of higher-order functions, and lay them side-by-side, and order them by principles, we'll have some real understanding and clarity in computing. Instead, I find that higher-order functions simply hide more, and more, and more, until we cannot move naturally towards our goals. It's like using the specific musical knowledge of, say, a bass player, to choreograph a ballet. It's good stuff, but it requires too many unique transformations to get where you want to go.&lt;br /&gt;&lt;br /&gt;If you look at this first working Grogix example, &lt;a href="http://www.grogix.org/home/listitem"&gt;ListItem.gx&lt;/a&gt;, you can see that the morphogenetic sequence for unfolding the program (steps 1 through 19) lays the the principles side-by-side ... a complete cross-cutting, holistic application ... but that's easy when there's very little structural repetition, in such a simple web application.&lt;br /&gt;&lt;br /&gt;So, let's say that we're creating a web application with &lt;span style="font-style:italic;"&gt;multiple&lt;/span&gt; features that are organized nearly identically -- a simple example is a single dynamic web page with multiple update-able and extend-able content.&lt;br /&gt;&lt;br /&gt;I've created a structure in Grogix which I call "mux/demux" to deal with repeated distribution across several steps in a sequence.&lt;br /&gt;&lt;br /&gt;In one step, one defines the "multiplexer" production:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;.step 6: 'Global structure'&lt;br /&gt;&lt;br /&gt;.muxP : 'global structure'&lt;br /&gt;.mP : 'main page'&lt;br /&gt;.mP : 'news section'&lt;br /&gt;.mP : 'news item'&lt;br /&gt;.mP : 'link section'&lt;br /&gt;.mP : 'link item'&lt;br /&gt;.mP : 'user content section'&lt;br /&gt;.mP : 'user content item'&lt;br /&gt;.mP : 'group content section'&lt;br /&gt;.mP : 'group content item'&lt;br /&gt;.dnt : 'db declarations'&lt;br /&gt;.dnt : 'handler declarations'&lt;br /&gt;.dnt : 'handler map entries'&lt;br /&gt;.dnt : 'template dictionaries'&lt;br /&gt;.dnt : 'templates'&lt;br /&gt;.muxP end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;And then in five other "demultiplexing" steps, one applies the application-wide pattern ('db declarations' etc.) to each of the similar application sections:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.step 9: 'handler map entries'&lt;br /&gt;&lt;br /&gt;.demux : 'handler map entries'&lt;br /&gt;&lt;br /&gt;.template: '' : 'inside_string', 'rountine_name' , KEY&lt;br /&gt;&lt;&lt;&lt;&lt;br /&gt; ('/inside_string/KEY', routine_name)&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;# add (.*)/ for KEY when you need it&lt;br /&gt;&lt;br /&gt;.dmP : 'main page'&lt;br /&gt;.t : typical_entry ('','Main','')&lt;br /&gt;.t : ','&lt;br /&gt;&lt;br /&gt;.dmP : 'news section'&lt;br /&gt;.t : typical_entry ('news','News','')&lt;br /&gt;.t : ','&lt;br /&gt;&lt;br /&gt;.dmP : 'news item'&lt;br /&gt;.t : typical_entry ('news_item','News_Item','')&lt;br /&gt;.t : ','&lt;br /&gt;&lt;br /&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since the .dnt's = .steps = patterns from a pattern gradient, this effectively lets me program "holistically" ... I can turn a formerly functional application inside out, with generative grammar, so that the principles are applied explicitly wherever needed. I can add unique concerns to this step, and more than one demux, thereby concentrating the global "what" and "how" together for anyone who might subsequently read the program, wanting to understand the principles applied.&lt;br /&gt;&lt;br /&gt;It also maintains a global minimalism. Which is nature's strength: the point of Grogix.&lt;br /&gt;&lt;br /&gt;This isn't quite sufficient though. We've dealt only with multiple applications of functions, not with the higher-order functions. We need these too ... you could write a complex program without one, but you still need them to minimize the encoding of action. A good example is this multiple-web-section application. There will be further patterns to apply to &lt;span style="font-style:italic;"&gt;all&lt;/span&gt; the "mux" sections, long after the first "demux".&lt;br /&gt;&lt;br /&gt;And so, we need an arbitrary number of &lt;span style="font-style:italic;"&gt;levels&lt;/span&gt; of "demuxing".&lt;br /&gt;&lt;br /&gt;Essentially, we need to apply the original sets of .muxP production targets to any production with a non-terminal that appears in the first demux section. This maintains the global principle aspect, while allowing the power of &lt;span style="font-style:italic;"&gt;higher-order functions&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;multiple application of functions&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;I'll provide a full example in the next post.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-923755554179408442?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/923755554179408442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/09/rethinking-fundamental-aspects-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/923755554179408442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/923755554179408442'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/09/rethinking-fundamental-aspects-of.html' title='Rethinking the fundamental aspects of functions'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-7771607737302814628</id><published>2009-09-09T15:07:00.000-07:00</published><updated>2010-03-11T09:32:59.001-08:00</updated><title type='text'>Blooming Logic</title><content type='html'>&lt;a href="http://www.bloominglogic.com"&gt;bloominglogic&lt;/a&gt; is a work in progress ... one of my projects is an online tool, or webapp, for viewing, editing, and running &lt;a href="http://www.grogix.org"&gt;Grogix&lt;/a&gt; sequences.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-7771607737302814628?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/7771607737302814628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/09/blooming-logic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7771607737302814628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/7771607737302814628'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/09/blooming-logic.html' title='Blooming Logic'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-190025613070609286</id><published>2009-09-09T15:04:00.000-07:00</published><updated>2009-09-09T15:06:11.481-07:00</updated><title type='text'>Grogix</title><content type='html'>&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.grogix.org"&gt;grogix&lt;/a&gt;&lt;/span&gt;: &lt;span style="font-style:italic;"&gt;n. a formal notation for describing holistic, integrative sequences, or recipes.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-190025613070609286?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/190025613070609286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/09/grogix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/190025613070609286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/190025613070609286'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/09/grogix.html' title='Grogix'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-2050173085220997635</id><published>2009-09-09T15:01:00.000-07:00</published><updated>2009-09-09T15:03:51.712-07:00</updated><title type='text'>Groggy</title><content type='html'>&lt;span style="font-weight:bold;"&gt;groggy&lt;/span&gt;: &lt;span style="font-style:italic;"&gt;adj.the feeling of having consumed grog, stimulating abstract thoughts.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-2050173085220997635?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/2050173085220997635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/09/groggy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/2050173085220997635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/2050173085220997635'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/09/groggy.html' title='Groggy'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2850382922506784765.post-5145666674055374327</id><published>2009-08-25T12:49:00.000-07:00</published><updated>2009-08-26T21:57:09.268-07:00</updated><title type='text'>Grog</title><content type='html'>&lt;span style="font-weight:bold;"&gt;grog&lt;/span&gt;: &lt;span style="font-style:italic;"&gt;n. a drink made from an &lt;span style="font-style:italic;"&gt;ad hoc&lt;/span&gt; recipe, i.e. based upon principles and intuition rather than exact measurement. Consequently, the number of possible variations are innumerable.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.gregbryant.com"&gt;Greg Bryant&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2850382922506784765-5145666674055374327?l=grogix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grogix.blogspot.com/feeds/5145666674055374327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grogix.blogspot.com/2009/08/grog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/5145666674055374327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2850382922506784765/posts/default/5145666674055374327'/><link rel='alternate' type='text/html' href='http://grogix.blogspot.com/2009/08/grog.html' title='Grog'/><author><name>Greg Bryant</name><uri>http://www.blogger.com/profile/13408526593029789018</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
