Project List

Mail me

Last update: 2012-05-07

FCA Workbench - Formal Concept Analysis Workbench


FCA Workbench is intended to be a (universal) tool for people engaged in the field of formal concept analysis (FCA). It allows to edit formal contexts and display the corresponding line diagram (concept lattice) in real-time as you go along. Furthermore the program comes with a programming language that combines logical and functional programming.

This is work in progress.


(Almost) Done

The software is still in progress. The following features are implemented:

In Progress/To be Done

How the Programming Language Looks Like


    > ostrich, eagle, finch isA bird.
    > ostrich, eagle, finch can fly.
    > ostrich, eagle, finch has feather.
    > bat can fly.
defines three formal contexts isA, can and has that look like this:
    (isA)   bird    (can)   fly    (has)   feather
    ostrich X       ostrich X      ostrich X
    eagle   X       eagle   X      eagle   X
    finch   X       finch   X      finch   X
                    bat     X
They have only one attribute for ease of use. Of course the contexts could have as many attributes as required.


Data can now be queried from the contexts defines above:
    > <which animal> has feather && <which animal> can fly?
    <which animal>=eagle can fly.
    <which animal>=finch can fly.
    <which animal>=ostrich can fly.
    <which animal>=eagle has feather.
    <which animal>=finch has feather.
    <which animal>=ostrich has feather.


Rules are used to define (derived) contexts:
    > anton fatherOf peter, paul, mary.
    > jack fatherOf anton, joe.
    > <x> grandfatherOf <y> <- <x> fatherOf <z> && <z> fatherOf <y>.
    > <who> grandfatherOf <whom>?
    <who>=jack grandfatherOf <whom>=peter.
    <who>=jack grandfatherOf <whom>=paul.
    <who>=jack grandfatherOf <whom>=mary.


Define yourself a function:
    > fib: integer --> integer :=
      0       |-> 0;
      1       |-> 1;
      <x> > 1 |-> fib(<x> - 1) + fib(<x> - 2).
    > fib(10)?
You can also define prefix, infix and postfix operators. Infix operators can have different rank and associativity. Additionally the language provides pattern matching. (Please note that boolean is a built-in type and that ∧ (&&), ∨ (||) and ¬ (!) operators are predefined. Actually there is no necessity to define that operators below.):
    > @infixl multiplicative
      /\ : boolean, boolean --> boolean :=
          true, true |-> true;
          <x>, <y>   |-> false.

    > @infixl additive
      \/ : boolean, boolean --> boolean :=
          true, <y> |-> true;
          <x>, true |-> true;
          <x>, <y>  |-> false.

    > @prefix
      ^ : boolean --> boolean :=
          true  |-> false;
          false |-> true.	

Rules with Functions

If a context is regular, then use functions to describe its content:
    > <o> GE_10 <a> <- {(<o>,<a>) (- [1...10]*[1...10] | <o> >= <a>}.
creates the context:
    (GE_10) 1 2 3 4 5 6 7 8 9 10
     1      X
     2      X X
     3      X X X
     4      X X X X
     5      X X X X X
     6      X X X X X X 
     7      X X X X X X X
     8      X X X X X X X X
     9      X X X X X X X X X
    10      X X X X X X X X X X
Try a more complex function:
    > <x> FIB <fx> <- {(<x>,<fx>) (- [0...10]*[0...55] | <fx> == fib(<x>)}.
This leads to creation of the context:
    (FIB)  0  1  2  3  5  8 13 21 34 55
    0      X
    1         X
    2         X
    3            X
    4               X
    5                  X
    6                     X
    7                        X
    8                           X
    9                              X
    10                                X

Screen Shots

The Line Diagram Viewer/Editor

The Context/Table Editor

The Interactive Command Line Console

Copyright Statement

FCA Workbench Copyright (C) 2013 Holger Zahnleiter


The information on this web site and the documents downloadable from here have been carefully reviewed and is believed to be reliable, but I do not assume any liability arising out of the application or use of any documents, programs or circuit described herein.
Furthermore I want to declare that I'm not responsible in any way for the content of other web pages, books and other sources I'm refering to.