Skip to content
This repository has been archived by the owner on Nov 3, 2019. It is now read-only.

tvondra/fuzzy_logic

Repository files navigation

Fuzzy logic

This extension provides basic logical operators (conjunction, disjunction, implication and negation) for three basic fuzzy logics - Łukasiewicz, Gödel and product. For the Łukasiewicz logic, there are also operators for weak conjunction and disjunction.

Installation

Technically, there are three extensions - one for each logic. You have to choose just one of them, as all of them define the same operators.

  • godel_logic - Gödel logic
  • lukasiewicz_logic - Łukasiewicz logic
  • product_logic - product logic

So let's say you've chosen Łukasiewicz logic, therefore you want to install the lukasiewicz_logic extension. If you're on 9.1 (or newer), all you need to do to install it is

$ make install

and then

db=# CREATE EXTENSION lukasiewicz_logic;

This should create a fuzzy_boolean data type (technically a FLOAT domain) and four basic logical operators (shared by all three extensions):

  • & - conjunction (AND)
  • | - disjunction (OR)
  • ! - negation (NOT)
  • -> - implication

and two logical operators (just for Łukasiewicz logic)

  • && - weak conjunction
  • || - weak disjunction

So now when the logic is installed, let's use it.

Usage

Using the extension is quite straightforward - get somewhere a fuzzy boolean value and apply the operators to it. E.g. you can do this

db=# SELECT (0.5 & 0.5) -> (!0.3 | 0.3);

 result 
--------
      1

or you may create a table with fuzzy_boolean column. Or maybe you can define predicates - functions returning fuzzy_boolean values and then use them like this

db=# SELECT is_fast(speed) & (! is_expensive(price)) FROM cars;

and so on.

Drawbacks

The first thing to realize is that with fuzzy logic the world is not just black and white anymore. There's not just perfect truth and falsehood - there're many degrees of truth. The unpleasant consequence is that the indexing does not work as efficiently as with plain boolean values.

You can make it work with simple conditions like these

db=# SELECT * FROM cars WHERE is_fast > 0.8

or with a predicate and an expression index

db=# SELECT * FROM cars WHERE is_fast(speed) > 0.8

But once you start combining the conditions, the indexing does not work. Consider for example this query

db=# SELECT * FROM cars WHERE is_fast & (! is_expensive) > 0.75

With plain boolean conditions, it could be evaluated using a bitmap index scan, but with fuzzy logic that's not possible.

About

Extension with basic fuzzy logic operators (Gödel, Łukasiewicz and product)

Resources

Stars

Watchers

Forks

Packages

No packages published