Here's a early Sentences implementation in Rebol. This script just displays
a sentences database:

[
Rebol [
    Name: 'Triple
    Title: "Triple"
    File: %Triple.r
    ]

;File: %Flight.r
File: %Bookseller.r
Liquid: melt load File
I: 0
foreach Drop Liquid [
    I: I + 1
    if block? Drop [
        print [I Drop]
        ]
    ]

save File freeze sort Liquid

halt
]

These next values are the contents of %Flight.r:

"arrived at"
"at"
"Flight BA1234"
"London, Heathrow"
"on" [./3 ./1 ./4]
[./6 ./5 12-Aug-1998]
[./7 ./2 10:25]

and these values are the contents of %Bookseller.r:

"Amazon"
"America"
"at"
"Book"
"Bookpages"
"Britain"
"Country"
"customer of"
"Date"
"Dr No"
"from"
"has earned"
"in"
"is a"
"Legal Entity"
"lives in"
"Mary Davis"
"on"
"orders"
"Person"
"Points"
"Price"
"sells"
"Simon Williams"
"Spycatcher"
"worth"
[./1 ./14 ./15]
[./1 ./23 ./10]
[./1 ./23 ./25]
[./2 ./14 ./7]
[./5 ./14 ./15]
[./5 ./23 ./10]
[./5 ./23 ./25]
[./6 ./14 ./7]
[./10 ./14 ./4]
[./15 ./23 ./4]
[./17 ./8 ./1]
[./17 ./14 ./20]
[./17 ./16 ./2]
[./20 ./8 ./15]
[./20 ./16 ./7]
[./24 ./8 ./5]
[./24 ./14 ./20]
[./24 ./16 ./6]
[./25 ./14 ./4]
[./28 ./13 ./2]
[./28 ./13 ./6]
[./28 ./26 75]
[./29 ./13 ./2]
[./29 ./13 ./6]
[./29 ./26 50]
[./32 ./13 ./2]
[./32 ./13 ./6]
[./32 ./26 35]
[./33 ./13 ./2]
[./33 ./26 35]
[./36 ./13 ./7]
[./36 ./26 ./21]
[./37 ./12 750]
[./37 ./19 ./25]
[./40 ./12 ./21]
[./40 ./19 ./4]
[./42 ./12 1200]
[./42 ./19 ./10]
[./46 ./11 1-Mar-2000]
[./47 ./11 1-Jan-2000]
[./49 ./11 1-Jun-2000]
[./50 ./11 1-Jun-2000]
[./52 ./11 1-Jan-2000]
[./53 ./11 1-Jan-2000]
[./55 ./11 1-Jun-2000]
[./57 ./11 ./9]
[./60 ./18 19-Oct-2000]
[./62 ./18 ./9]
[./64 ./18 10-Oct-2000]
[./65 ./3 $16.00]
[./66 ./3 $10.00]
[./67 ./3 $12.00]
[./68 ./3 $7.00]
[./69 ./3 $14.00]
[./70 ./3 $8.00]
[./71 ./3 $13.00]
[./72 ./3 ./22]
[./73 ./3 $12.00]
[./74 ./3 ./22]
[./75 ./3 $10.00]

You'll also need %Melt.r:

[
Rebol [
    Name: 'Melt
    Title: "Melt"
    File: %"Melt.r"
    Author: "Andrew Martin"
    eMail: [EMAIL PROTECTED]
    Date: 5/May/2002
    Acknowledgements: "Romano Paolo Tenca"
    ]

make object! [
    Magic: '.    ; This must be the same as the 'Freeze function!
    Melt-Value: function [Ice [block!] Berg] [Value Path] [
        Value: :Berg
        if all [
            path? :Berg
            Magic = first :Berg
            ] [
            Path: :Berg
            if all [
                2 <= length? :Path
                integer? second :Path
                ] [
                Value: pick Ice second :Path
                if all [
                    3 = length? :Path
                    integer? third :Path
                    ] [
                    Value: at Value third :Path
                    ]
                ]
            ]
        :Value
        ]
    set 'Melt function [
    "Melts Object Ice" Ice [block!]
    ] [Block Object] [
        foreach Berg Ice [
            type? Berg
            switch type?/word :Berg [
                block! [
                    Block: Berg
                    forall Block [
                        Block/1: Melt-Value Ice pick Block 1
                        ]
                    ]
                object! [
                    first Object: Berg
                    foreach Word next first Object [
                        set in Object Word Melt-Value Ice
                            get in Object Word
                        ]
                    ]
                ]
            ]
        Ice    ; At this point, the 'Ice has become sea. :)
        ]
    ]

]

And %Freeze.r:

[
Rebol [
    Name: 'Freeze
    Title: "Freeze"
    File: %"Freeze.r"
    Author: "Andrew Martin"
    eMail: [EMAIL PROTECTED]
    Date: 7/May/2002
    Acknowledgements: "Romano Paolo Tenca"
    ]

make object! [
    Magic: '.    ; This must be the same as the 'Melt function!
    Find-Same: func [Series [series!] Value [any-type!]] [
        forever [
            if any [
                not found? Series: find/only/case Series :Value
                same? first Series :Value
                ] [
                break/return Series
                ]
            Series: next Series
            ]
        ]
    Freeze-Value: function [
        Sea [block!] Fish
        ] [Path Value Index] [
        if all [
            not lit-path? :Fish
            not path? :Fish
            any [
                function? :Fish
                object? :Fish
                series? :Fish
                ]
            ] [
            Path: make path! reduce [Magic]
            Value: either series? :Fish [head :Fish] [:Fish]
            either found? Index: Find-Same Sea :Value [
                Index: index? Index
                ] [
                append/only Sea :Value
                Index: length? Sea
                ]
            append :Path Index
            if all [
                series? :Fish
                1 < Index: index? Fish
                ] [
                append/only :Path Index
                ]
            Fish: :Path
            ]
        :Fish
        ]
    set 'Freeze function [
        "Freezes Object Sea" Sea [block!]
        ] [Block Object] [
        foreach Fish Sea [
            switch type?/word :Fish [
                block! [
                    Block: Fish
                    forall Block [
                        Block/1: Freeze-Value Sea pick Block 1
                        ]
                    ]
                object! [
                    Object: Fish
                    foreach Word next first Object [
                        set in Object Word Freeze-Value
                            Sea get in Object Word
                        ]
                    ]
                ]
            ]
        Sea    ; At this point, the 'Sea has become ice. :)
        ]
    ]

]

%Flight.r and %Bookseller.r are example implementations of Lazy Software's
examples in the .pdf titled "The Associative Model of Data White Paper".

Here's an example of the %Flight.r print out:

6 Flight BA1234 arrived at London, Heathrow
7 Flight BA1234 arrived at London, Heathrow on 12-Aug-1998
8 Flight BA1234 arrived at London, Heathrow on 12-Aug-1998 at 10:25

And here's a 'probe of value of 'Liquid:

[
    "arrived at"
    "at"
    "Flight BA1234"
    "London, Heathrow"
    "on" [
        "Flight BA1234"
        "arrived at"
        "London, Heathrow"] [[
            "Flight BA1234"
            "arrived at"
            "London, Heathrow"]
        "on" 12-Aug-1998] [[[
                "Flight BA1234"
                "arrived at"
                "London, Heathrow"]
            "on" 12-Aug-1998]
        "at" 10:25]
]

after being 'melt-ed.

Note that non-series values should be the third value of the triple. These
are values like date!, time!, money!, integer! and so on.

Also note that this software may fail on the latest version of Rebol,
because of the change in the way path! values are handled.

Andrew Martin
ICQ: 26227169 http://valley.150m.com/
-><- Rebolutionary



-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to