fuzzylogic 0.2.0

  • README.md
  • Installing
  • Versions
  • 31

Fuzzy Logic for Dart

This is a module for fuzzy logic in Dart. It takes some inspiration from the FCL (Fuzzy Control Language) IEC 1131-7 specification, but otherwise strives to be a 'Dart-y' way to create and work with fuzzy rules.

The goal of this project is to make it extremely easy to implement fuzzy logic when creating:

  1. Artificial intelligence in Web-based games.
  2. Intelligent user experience in websites.

Example of use

Here's code that implements the "Designing FLVs for Weapon Selection" (pp. 425-437) fuzzy logic example from Mat Buckland's excellent book Programming Game AI by Example (2005).

// Set up variables.
var distanceToTarget = new Distance();
var bazookaAmmo = new Ammo();
var bazookaDesirability = new Desirability();

// Add rules.
var frb = new FuzzyRuleBase();
    (distanceToTarget.Far & bazookaAmmo.Loads) >> (bazookaDesirability.Desirable),
    (distanceToTarget.Far & bazookaAmmo.Okay) >> (bazookaDesirability.Undesirable),
    (distanceToTarget.Far & bazookaAmmo.Low) >> (bazookaDesirability.Undesirable),
    (distanceToTarget.Medium & bazookaAmmo.Loads) >> (bazookaDesirability.VeryDesirable),
    (distanceToTarget.Medium & bazookaAmmo.Okay) >> (bazookaDesirability.VeryDesirable),
    (distanceToTarget.Medium & bazookaAmmo.Low) >> (bazookaDesirability.Desirable),
    (distanceToTarget.Close & bazookaAmmo.Loads) >> (bazookaDesirability.Undesirable),
    (distanceToTarget.Close & bazookaAmmo.Okay) >> (bazookaDesirability.Undesirable),
    (distanceToTarget.Close & bazookaAmmo.Low) >> (bazookaDesirability.Undesirable)

// Create the placeholder for output.
var bazookaOutput = bazookaDesirability.createOutputPlaceholder();

// Use the fuzzy inference engine.
    inputs: [distanceToTarget.assign(200), bazookaAmmo.assign(8)], 
    outputs: [bazookaOutput]);


There are two main components to the code example above. The setup phase consists of setting up the fuzzy language variables (FLVs) and the rule set. This is normally done once per runtime only. The rest of the code is normally run periodically, or every time a decision is needed. It consists of creating placeholder variable(s) and resolving them using the rule set and given (crisp) values.

Fuzzy Language Variables and Values

You can use the generic FuzzyVariable, but in most cases, you want to subclass it as follows:

class Distance extends FuzzyVariable<num> {
  var Close = new FuzzySet.LeftShoulder(0, 25, 150);
  var Medium = new FuzzySet.Triangle(25, 150, 300);
  var Far = new FuzzySet.RightShoulder(150, 300, 400);
  Distance() {
    sets = [Close, Medium, Far];

This creates a fuzzy language variable that can be then instantiated by calling distance = new Distance(). It's fuzzy sets are accessed via distance.Close, distance.Medium and distance.Far.

When decision is needed according to some crisp distance n, you create a fuzzy value from the fuzzy variable by calling distance.assign(n). This value is then passed to a FuzzyRuleBase resolve() method as input.

var currentDistance = distance.assign(200);  // We are 200 meters away.
    inputs: [currentDistance], 
    outputs: [bazookaOutput]);

Fuzzy Rules

This library uses Dart's operator overloading for easier and more readable definition of fuzzy rules.

(distance.Far & ammo.Loads) >> (bazookaDesirability.Desirable)

Note that the overloaded operators are the bitwise ones, not the boolean ones. It's & for logical AND, | for logical OR, and ~ for logical NOT (as opposed to &&, || and !). This is because the boolean operators cannot be overridden, and – more importantly – the use of slightly different operands helps convey the fact that this is not boolean logic.

Dart will correctly issue a warning if you try to use the boolean operands to construct a fuzzy rule.

Also note the >> operand, meaning THEN. It was chosen for its resemblance to the mathematical implication symbol (⇒). Because the operand has low precedence, the antecedent and the conseqent (what comes before and after the symbol) need to be in brackets.

Operator overloading tends to be controversial and can be very confusing. I am hoping that in this case, its advantages clearly outweigh the disadvantages. You will be writing a lot of rules in your fuzzy language modules. The more terse the symbology, the more readable the rule.

1. Depend on it

Add this to your package's pubspec.yaml file:

  fuzzylogic: "^0.2.0"

2. Install it

You can install packages from the command line:

with pub:

$ pub get

with Flutter:

$ flutter packages get

Alternatively, your editor might support pub get or packages get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:fuzzylogic/fuzzylogic.dart';
Version Uploaded Documentation Archive
0.2.0 Apr 3, 2016 Go to the documentation of fuzzylogic 0.2.0 Download fuzzylogic 0.2.0 archive
0.1.4 Aug 22, 2015 Go to the documentation of fuzzylogic 0.1.4 Download fuzzylogic 0.1.4 archive
0.1.3 Nov 17, 2013 Go to the documentation of fuzzylogic 0.1.3 Download fuzzylogic 0.1.3 archive
0.1.2 Oct 14, 2013 Go to the documentation of fuzzylogic 0.1.2 Download fuzzylogic 0.1.2 archive
0.1.1 Oct 14, 2013 Go to the documentation of fuzzylogic 0.1.1 Download fuzzylogic 0.1.1 archive
0.1.0 Oct 13, 2013 Go to the documentation of fuzzylogic 0.1.0 Download fuzzylogic 0.1.0 archive


This feature is new.
We welcome feedback.
More details: scoring.

We analyzed this package, and provided a score, details, and suggestions below.

  • tool failures on Feb 3, 2018
  • Dart: 2.0.0-dev.20.0
  • pana: 0.10.1


Describes how popular the package is relative to other packages. [more]
0 / 100
Code health derived from static analysis. [more]
95 / 100
Reflects how tidy and up-to-date the package is. [more]
12 / 100
Overall score:
Weighted score of the above. [more]


Detected platforms: Flutter, web, other

No platform restriction found in primary library package:fuzzylogic/fuzzylogic.dart.


  • Fix lib/src/set.dart.

    Strong-mode analysis of lib/src/set.dart failed with the following error:

    line: 99 col: 31
    The initializer type 'double' can't be assigned to the field type 'T'.

  • Maintain CHANGELOG.md.

    Changelog entries help clients to follow the progress in your code.

  • Fix issues reported by dartanalyzer.

    dartanalyzer reported 1 error(s) and 0 warning(s).

  • The description is too short.

    Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.

  • Package is pre-v1 release.

    While there is nothing inherently wrong with versions of 0.*.*, it usually means that the author is still experimenting with the general direction API.

  • Maintain an example.

    Create a short demo in the example/ directory to show how to use this package. Common file name patterns include: main.dart, example.dart or you could also use fuzzylogic.dart.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.8.0 <2.0.0
logging ^0.11.2 0.11.3+1
Dev dependencies
test ^0.12.13