Revision: 48740
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 8, 2011 12:03 by bjornredemption
Initial Code
import java.util.*;
import java.io.*;
// to run simply do a: new BC(ask,tell) and then bc.execute()
// ask is a propositional symbol
// and tell is a knowledge base
// ask : p
// tell : p=>q;q=>r;r;
class BC{
// 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<String> entailed;
public BC(String a, String t){
// initialize variables
agenda = new ArrayList<String>();
clauses = new ArrayList<String>();
entailed = new ArrayList<String>();
facts = new ArrayList<String>();
tell = t;
ask = a;
init(tell);
}
// method which sets up initial values for backward chaining
public static void init(String tell){
agenda.add(ask);
// split kb into sentences
String[] sentences = tell.split(";");
for (int i=0;i<sentences.length;i++){
if (!sentences[i].contains("=>"))
// add the facts
facts.add(sentences[i]);
else{
// add the premises
clauses.add(sentences[i]);
}
}
}
// method which calls the main bcentails() method and returns output back to iengine
public String execute(){
String output = "";
if (bcentails()){
// the method returned true so it entails
output = "YES: ";
// loop through all entailed symbols in reverse
for (int i=entailed.size()-1;i>=0;i--){
if (i==0)
output += entailed.get(i);
else
// no comma at the end
output += entailed.get(i)+", ";
}
}
// no
else{
output = "NO";
}
return output;
}
// method which runs the bc algorithm
public boolean bcentails(){
// while the list of symbols are not empty
while(!agenda.isEmpty()){
// get current symbol
String q = agenda.remove(agenda.size()-1);
// add the entailed array
entailed.add(q);
// if this element is a fact then we dont need to go further
if (!facts.contains(q)){
// .. but it isnt so..
// create array to hold new symbols to be processed
ArrayList<String> p = new ArrayList<String>();
for(int i=0;i<clauses.size();i++){
// for each clause..
if (conclusionContains(clauses.get(i),q)){
// that contains the symbol as its conclusion
ArrayList<String> temp = getPremises(clauses.get(i));
for(int j=0;j<temp.size();j++){
// add the symbols to a temp array
p.add(temp.get(j));
}
}
}
// no symbols were generated and since it isnt a fact either
// then this sybmol and eventually ASK cannot be implied by TELL
if (p.size()==0){
return false;
}
else{
// there are symbols so check for previously processed ones and add to agenda
for(int i=0;i<p.size();i++){
if (!entailed.contains(p.get(i)))
agenda.add(p.get(i));
}
}
}
}//while end
return true;
}
// methid that returns the conjuncts contained in a clause
public static ArrayList<String> getPremises(String clause){
// get the premise
String premise = clause.split("=>")[0];
ArrayList<String> temp = new ArrayList<String>();
String[] conjuncts = premise.split("&");
// for each conjunct
for(int i=0;i<conjuncts.length;i++){
if (!agenda.contains(conjuncts[i]))
temp.add(conjuncts[i]);
}
return temp;
}
// method which checks if c appears in the conclusion of a given clause
// input : clause, c
// output : true if c is in the conclusion of clause
public static boolean conclusionContains(String clause, String c){
String conclusion = clause.split("=>")[1];
if (conclusion.equals(c))
return true;
else
return false;
}
}
Initial URL
http://en.wikipedia.org/wiki/Backward_chaining
Initial Description
Artificial intelligence basics : This is a backward 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/Backward_chaining
Initial Title
AI Backward Chaining implementation for propositional logic horn form knowledge bases
Initial Tags
java
Initial Language
Java