(sorry I just hit send on a blank email; I'm absent-minded)

First, in the strictest mathematical sense, a relation from a set $a to a
set $b is a subset of the cross-product $a x $b.

(obviously, the mathematical notation is not a great way to represent this
in a program.)

Hence, a relation is a set of ordered pairs: array(array('apple','red'),
array('ruby','red')) is a relation from the objects to the colors.

For a relation R from A to B, the inverse relation is defined by (b,a) for
all a in A and B in b.

Thus, the inverse relation of  objects ~ colors would be:

array(array('red','apple'), array('red','ruby')).

A function is a special case of a relation: functions have the property that
if a in A is related to b in B by the relation R and a is related to c by
the relation R, then a = c.

It follows that mathematically, there is no function f:color->object.

As you suggest, each element of the relation colors~objects relation must
return a list in order to be a function.

So... How does SQL solve this problem?

SQL has indexes.  You have a list of objects:

<?
$objects = array(
  array(
     'name'=>'apple',
     'type' => 'fruit',
     'color' => 'red'
  ),
  array(
     'name' => 'ruby',
     'type' => 'gem',
     'color' => 'red'
  )
);
?>

Given a type, you would like to find all objects with that type.  One way to
accomplish this might be:

<?php
function locate($property,$value,$objects) {
   $return = array();
    foreach ($objects as $object) {
        if ($object[$property] == $value)
             $return[] = $objects;
   }
   return $return;
}
?>

Obviously, the time increased to complete a search will increase with the
size of the $objects array.  This is where the indexes come in:  Suppose we
would like to easily be able to locate an object given a color, a type, or
its name:

<?php
//array, indexed by $property. Each element is an array of numbers, n,
corresponding to $objects[n].
$indexes = array();

//properties to index
$keys = array('color','type','name');

//initialize
foreach ($keys as $key)
    $indexes[$key] = array();

//this accomplishes the same thing as array_flip() ;)
foreach ($objects as $n => $object) foreach ($keys as $key) {
     if (!isset($indexes[$key][$object[$key]]))
           $indexes[$key][$object[$key]] = array();

     $indexes[$key][$object[$key]][] = $n;
}
?>

The above produces the following array:
Array
(
    [color] => Array
        (
            [red] => Array
                (
                    [0] => 0
                    [1] => 1
                )

        )

    [type] => Array
        (
            [fruit] => Array
                (
                    [0] => 0
                )

            [gem] => Array
                (
                    [0] => 1
                )

        )

    [name] => Array
        (
            [apple] => Array
                (
                    [0] => 0
                )

            [ruby] => Array
                (
                    [0] => 1
                )

        )

)

Conceptually, this is all SQL does.

Anyway... I wouldn't actually do any of that in an application. I'd probably
go with what Casey suggested.

-- GREG

Disclaimer: The above is intended only to be conceptual. Any attempt at
parsing may fail. Technical accuracy is not guaranteed.

P.S. Sorry for the math. I was bored :p

>  However, I can't easily find all items whose $color is 'red', nor all
>  items whose $type is 'fruit'. In other words, color() and type()
>  aren't full mathematical relations.
>
>  Of course, I could create the inverse function as I go along:
>
>  $inverse_color['red'] = ['apple', 'ruby']; # uglyish, assigning list to
value

By definition, not all relations are functions, nor all functions
invertible.

The function inverse_color(object) specifies more than

What you're referring to sounds like an index: given an object, you can easi
On Sun, Apr 6, 2008 at 8:15 PM, Casey <[EMAIL PROTECTED]> wrote:

> On Sun, Apr 6, 2008 at 4:52 PM, Kelly Jones <[EMAIL PROTECTED]>
> wrote:
> > Many programming languages (including Perl, Ruby, and PHP) support
> hashes:
> >
> >  $color['apple'] = 'red';
> >  $color['ruby'] = 'red';
> >
> >  $type['apple'] = 'fruit';
> >  $type['ruby'] = 'gem';
> >
> >  This quickly lets me find the color or type of a given item.
> >
> >  In this sense, color() and type() are like mathematical functions.
> >
> >  However, I can't easily find all items whose $color is 'red', nor all
> >  items whose $type is 'fruit'. In other words, color() and type()
> >  aren't full mathematical relations.
> >
> >  Of course, I could create the inverse function as I go along:
> >
> >  $inverse_color['red'] = ['apple', 'ruby']; # uglyish, assigning list to
> value
> >
> >  and there are many other ways to do this, but they all seem kludgey.
> >
> >  Is there a clean way to add 'relation' support to Perl, Ruby, or PHP?
> >
> >  Is there a language that handles mathematical relations
> naturally/natively?
> >
> >  I realize SQL does all this and more, but that seems like overkill for
> >  something this simple?
> >
> >  --
> >  We're just a Bunch Of Regular Guys, a collective group that's trying
> >  to understand and assimilate technology. We feel that resistance to
> >  new ideas and technology is unwise and ultimately futile.
> >
>
>
> Something like this?
>
> <?php
>  $objects = array(
>   'apple' => array(
>      'type' => 'fruit',
>      'color' => 'red'
>   ),
>   'ruby' => array(
>      'type' => 'gem',
>      'color' => 'red'
>   )
> );
>
> // Search for all red objects.
> $red = array();
> foreach ($objects as $name => $object) {
>   if ($object['type'] == 'red')
>      $red[] = $name;
> }
>
> ?>
> --
> -Casey
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to