(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
>
>