Revision: 48739
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 8, 2011 11:59 by bjornredemption
Initial Code
import java.util.*;
import java.io.*;
// to run simply do a: new FC(ask,tell) and then fc.execute()
// ask is a propositional symbol
// and tell is a knowledge base
// ask : r
// tell : p=>q;q=>r;p;q;
class FC{
// create variables
public static String tell;
public static String ask;
public static ArrayList<String> agenda;
public static ArrayList<String> facts;
public static ArrayList<String> clauses;
public static ArrayList<Integer> count;
public static ArrayList<String> entailed;
public FC(String a, String t){
// initialize variables
agenda = new ArrayList<String>();
clauses = new ArrayList<String>();
entailed = new ArrayList<String>();
facts = new ArrayList<String>();
count = new ArrayList<Integer>();
tell = t;
ask = a;
init(tell);
}
// method which calls the main fcentails() method and returns output back to iengine
public String execute(){
String output = "";
if (fcentails()){
// the method returned true so it entails
output = "YES: ";
// for each entailed symbol
for (int i=0;i<entailed.size();i++){
output += entailed.get(i)+", ";
}
output += ask;
}
else{
output = "NO";
}
return output;
}
// FC algorithm
public boolean fcentails(){
// loop through while there are unprocessed facts
while(!agenda.isEmpty()){
// take the first item and process it
String p = agenda.remove(0);
// add to entailed
entailed.add(p);
// for each of the clauses....
for (int i=0;i<clauses.size();i++){
// .... that contain p in its premise
if (premiseContains(clauses.get(i),p)){
Integer j = count.get(i);
// reduce count : unknown elements in each premise
count.set(i,--j);
// all the elements in the premise are now known
if (count.get(i)==0){
// the conclusion has been proven so put into agenda
String head = clauses.get(i).split("=>")[1];
// have we just proven the 'ask'?
if (head.equals(ask))
return true;
agenda.add(head);
}
}
}
}
// if we arrive here then ask cannot be entailed
return false;
}
// method which sets up initial values for forward chaining
// takes in string representing KB and seperates symbols and clauses, calculates count etc..
public static void init(String tell){
String[] sentences = tell.split(";");
for (int i=0;i<sentences.length;i++){
if (!sentences[i].contains("=>"))
// add facts to be processed
agenda.add(sentences[i]);
else{
// add sentences
clauses.add(sentences[i]);
count.add(sentences[i].split("&").length);
}
}
}
// method which checks if p appears in the premise of a given clause
// input : clause, p
// output : true if p is in the premise of clause
public static boolean premiseContains(String clause, String p){
String premise = clause.split("=>")[0];
String[] conjuncts = premise.split("&");
// check if p is in the premise
if (conjuncts.length==1)
return premise.equals(p);
else
return Arrays.asList(conjuncts).contains(p);
}
}
Initial URL
http://en.wikipedia.org/wiki/Forward_chaining
Initial Description
Artificial intelligence basics : This is a forward chaining implementation which works with horn form knowledge bases. Had some trouble finding any simple and easy to understand examples online - so here's my version!!! http://en.wikipedia.org/wiki/Forward_chaining
Initial Title
AI Forward Chaining implementation for propositional logic horn form knowledge bases
Initial Tags
java
Initial Language
Java