Phil,

I mixed up the books. It "Fundamentals of Smalltalk Programming Technique, Volume 1" by "Andres Valloud". Just checked it.

http://www.lulu.com/shop/andres-valloud/fundamentals-of-smalltalk-programming-technique-volume-1/paperback/product-5299835.html

CU,

Udo


On 23.09.14 16:05, Udo Schneider wrote:
Phil,

If I remember correctly one of Andres Valloud's books has some more
information on Boolean (logic) and Smalltalk. I think it was "A
Mentoring Course on Smalltalk" [1]. Definitely worth a read!!

CU,

Udo


[1]
http://www.lulu.com/shop/andres-valloud/a-mentoring-course-on-smalltalk/paperback/product-3788890.html



On 23.09.14 13:57, p...@highoctane.be wrote:
Thx for this!

I'd say that the material is worthy of inclusion into a bool chapter.

Phil

Le 23 sept. 2014 12:51, "Udo Schneider"
<udo.schnei...@homeaddress.de
<mailto:udo.schnei...@homeaddress.de>> a écrit :

    Phil,

    I'd say that's an implementation of the "Material implication"[1]
    operator from Propositional calculus.

    You can write it as

    P -> Q

    and read it as "P implies Q" or (not 100% correct) "if P (is true)
    then Q (is true)".

    Let's take a look at the truth table:

      P | Q | P -> Q
    ---+---+-------
      t | t | t
    ---+---+-------

    inserting it into the statement above yields:

    "if true then true" which is true indeed.

    The funny thing starts when we look at the case(s), where P is
    false. The general (verbal) rule says that if the premise (P) is
    false the truth value of the conclusion doesn't matter. Hence the
    complete term is true:

      P | Q | P -> Q
    ---+---+-------
      f | t | t
    ---+---+-------
      f | f | t
    ---+---+-------

    There is one case left: What happens if the premise is true but the
    conclusion is false? That's in direct violation of the defintion
    which states that "if P (is true) then Q (is true)". As P is true
    and Q is false the truth value of the complete term is false!

      P | Q | P -> Q
    ---+---+-------
      t | f | f
    ---+---+-------

    Or to put it in different words: An implication can only be false if
    the premise is true but the conclusion is false.

    So we end up with this truth table:

      P | Q | P -> Q
    ---+---+-------
      t | t | t
    ---+---+-------
      f | t | t
    ---+---+-------
      f | f | t
    ---+---+-------
      t | f | f
    ---+---+-------

    We did not take a look yet, at how to implement this with basic
    boolean operators. So we need to take a look at the table and find
    the expression: Let's start with the exception (fourth case). We can
    express this as:

    !(P & !Q) -> "The term is false if P is true and Q is false"

    I added the inner term "P & !Q" to the table to make it easier to
    follow:


      P | Q | P -> Q | P & !Q | !(P & !Q)
    ---+---+--------+--------+----__-------
      t | t | t      | f      | t
    ---+---+--------+--------+----__-------
      f | t | t      | t      | f
    ---+---+--------+--------+----__-------
      f | f | t      | f      | t
    ---+---+--------+--------+----__-------
      t | f | f      | f      | t
    ---+---+--------+--------+----__-------

    The "last" step is to simplify the term "!(P & !Q)" using one of de
    Morgan's laws:
    !(A & B) == !A | !B

    Using this for our term gives

    !(P & !Q) == !P | !!Q == !P | Q

      P | Q | P -> Q | P & !Q | !(P & !Q) | !P | Q
    ---+---+--------+--------+----__-------+--------
      t | t | t      | f      | t         | t
    ---+---+--------+--------+----__-------+--------
      f | t | t      | t      | f         | f
    ---+---+--------+--------+----__-------+--------
      f | f | t      | f      | t         | t
    ---+---+--------+--------+----__-------+--------
      t | f | f      | f      | t         | t
    ---+---+--------+--------+----__-------+--------

    So our final term is "correct" (proof in the truth table) and is
    equivalent to the smalltalk term:

    !P | Q  := self not or: [aBlock value]


    I have to admit though that implications in Propositional calculus
    really gave me a headache. You might simply want to accept that they
    are defined this way. And maybe it doesn't help ... but there are
    even more strange things lurking around the corner [4] :-)

    Although not immidiatly obvious all the terms in Propositional
    calculus do not neccessarly have a semantic meaning in context to
    each other. They are totaly independent. The only thing that counts
    is the truth value of its terms. E.g. something like this is
    mathematically/syntacically valid but doesn't make any sense from a
    semantic point of view:

    P := I am 12y old
    Q := It rains

    The term "P -> Q" is perfectly fine mathematically/syntacically but
    doesn't mean anything in terms of semantics.


    Hope this helps.

    CU,

    Udo


    [1]

http://en.wikipedia.org/wiki/__Material_implication_(rule_of___inference)

<http://en.wikipedia.org/wiki/Material_implication_(rule_of_inference)>
    [2] http://en.wikipedia.org/wiki/__Propositional_calculus
    <http://en.wikipedia.org/wiki/Propositional_calculus>
    [3] http://en.wikipedia.org/wiki/__De_Morgan's_laws
    <http://en.wikipedia.org/wiki/De_Morgan's_laws>
    [4]
    http://en.wikipedia.org/wiki/__Paradoxes_of_material___implication
    <http://en.wikipedia.org/wiki/Paradoxes_of_material_implication>

    On 23.09.14 10:49, p...@highoctane.be
    <mailto:p...@highoctane.be> wrote:

        Cool article & technique indeed. Ah Smalltalk, where were you
        all those
        years ;-)

        Speaking of PetitParser, which is excellent indeed, there is
        this #==>
        method in Boolean.

        PetitParser uses that a lot. I can use the thing but do not
really
        grasps how it works.

        Now, the method comment says:

        Boolean #==> aBlock
        "The material conditional, also known as the material
implication or
        truth functional conditional.Correspond to not ... or ... and
        does not
        correspond to the English if...then... construction.
        known as:
        b if a
        a implies b
        if a then b
        b is a consequence of a
        a therefore b (but note: 'it is raining therefore it is
cloudy' is
        implication; 'it is autumn therefore the leaves are falling' is
        equivalence).
        Here is the truth table for material implication:
            p   |   q   |   p ==> q
        -------|-------|-------------
            T   |   T   |      T
            T   |   F   |      F
            F   |   T   |      T
            F   |   F   |      T
        "

        ^self not or: [aBlock value]


        This is still a bit foggy to me.

        Anyone caring to shed some light on that?
        What are the typical ways to use that?

        TIA
        Phil




        On Tue, Sep 23, 2014 at 10:07 AM, Udo Schneider
        <udo.schnei...@homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>
        <mailto:udo.schneider@__homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>>>
        wrote:

              > just as it is black magic for me now :D
             The nice thing about this approach is the fact that it
"just"
             piggybacks the normal Smalltalk message sending. So you can
        step
             through it using the Debugger - it's Smalltalk all the way
        down.

             I still remember my first shock when (having no formal
        background on
             parsing theory at that time) I saw the parsing tables
        generated by
             T-Gen. Of course it was Smalltalk ... but understanding
        those tables
             was a nightmare.

             PetitParser is the gold standard here IMHO. It is able to
parse
             arbitrary input (compared to my block expressions only).
        And you can
             still use the Debugger to step through the parsing
process *and
             still understand what's going on!*

             CU,

             Udo

             On 23.09.14 09:54, kilon alios wrote:

                 just as it is black magic for me now :D

                 At least I get the general feeling. I am new to parsing
        too, so
                 far I
                 have only played with regex parsing. Not the most
        smalltalkish
                 way but
                 it works well so far.

                 On Tue, Sep 23, 2014 at 9:39 AM, Udo Schneider
                 <udo.schnei...@homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>
                 <mailto:udo.schneider@__homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>>
                 <mailto:udo.schneider@
        <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de>
                 <mailto:udo.schneider@__homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>>>>
                 wrote:

                      Hi Estaban,

                      I think the first time I saw this pattern was in
        ReStore on
                 Dolphin
                      Smalltalk. I didn't understand it's implementation
        back then. I
                      assume that it's similar to what I described
        though. But
                 having a
                      Smalltalk block automagically creating the
        equivalent SQL
                 SELECT
                      expression was like black magic at that time :-)

                      CU,

                      Udo




                      On 23.09.14 04:15, Esteban A. Maringolo wrote:

                          Excellent article.

                          I think GLORP uses a similar technique to
        setup its
                 expressions, and
                          also have issues with #and:/#or: selectors
due to
                 inlining, so
                          it uses
                          AND:/#OR: instead.

                          Regards!

                          Esteban A. Maringolo

                          pd: Your blog and it's choosen topic made me
        remember
        http://use-the-index-luke.com/

                          2014-09-22 20:48 GMT-03:00 Udo Schneider

<udo.schnei...@homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>
                 <mailto:udo.schneider@__homeaddress.de
        <mailto:udo.schnei...@homeaddress.de>>
                          <mailto:udo.schneider@
        <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de>
                 <mailto:udo.schneider@__homeaddress.de

<mailto:udo.schnei...@homeaddress.de>>>>__:


                              All,

                              I just finished a blog entry. It shows how
        to use
                 Smalltalk
                              blocks as parsers/translators. E.g.
        translating a Block

                                        [:customer | (customer joinDate
        year is: Date
                              today year)]

                              into an SQL-like String

                                        (YEAR(customers.joinDate) = 2014)

                              The SQL stuff is just an example - you can
        create
                 nearly any
                              output.

                              Check out

http://readthesourceluke.__blo____gspot.de/2014/09/block-______translators-parsing-magic.html


<http://blo__gspot.de/2014/09/block-____translators-parsing-magic.html>


<http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html

<http://blogspot.de/2014/09/block-__translators-parsing-magic.html>>



<http://readthesourceluke.__bl__ogspot.de/2014/09/block-____translators-parsing-magic.html


<http://blogspot.de/2014/09/block-__translators-parsing-magic.html>


<http://readthesourceluke.__blogspot.de/2014/09/block-__translators-parsing-magic.html


<http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html>__>__>


                              Maybe that's old stuff for some of you -
        but I hope
                 it's
                              interesting for some at least :-)

                              Comments and feedback appreciated.

                              CU,

                              Udo
























Reply via email to