- From: Gary Hallmark <gary.hallmark@oracle.com>
- Date: Thu, 16 Mar 2006 09:53:05 -0800
- To: public-rif-wg@w3.org
- Message-ID: <4419A601.5010105@oracle.com>
This is a follow up to last week's email thread where Hassan issued a challenge to write production rules to perform append, presumably restricted to assert actions and the following operations on sequences (or lists): first, rest, cons, isEmpty, and isEqual. First is a terse solution in an ad hoc language: appendArgs([],R) -> appendResult([], R, R) appendArgs([H|T], R) -> appendArgs(T, R) appendArgs([H|T], X), appendResult(T, X) -> appendResult([H|T], X, [H|R]) To perform an append, assert an appendArgs fact, e.g. appendArgs([a b c], [d e]). The result is contained in an appendResult fact, e.g. appendResult([a b c], [d e], [a b c d e]) I have tested this using Oracle's ascii java-like production rule language, which I've attached.
/*
This is a sample program written in Oracle's java-like rule language (RL).
This sample uses Rules to append 2 lists.
We use java.util.List, but we use only get(0),
isEmpty(), add(0), and subList(1, size()) methods.
We define RL functions to look "lispy" that encapsulate the List methods.
This doubles as a use-case for user defined functions in RIF, by the way.
*/
import java.util.*;
function cons(Object first, List rest) returns List {
List ret = new ArrayList(rest);
ret.add(0, first);
return ret;
}
function isEmpty(List list) returns boolean {
return list.isEmpty();
}
function isEqual(List list1, List list2) returns boolean {
return list1.equals(list2);
}
function first(List list) returns Object {
return list.get(0);
}
function rest(List list) returns List {
return list.subList(1, list.size());
}
class AppendArgs {
List left;
List right;
}
class AppendResult {
List left;
List right;
List result;
}
rule push {
if fact AppendArgs a && !isEmpty(a.left) {
assert(new AppendArgs(left: rest(a.left), right: a.right));
}
}
rule base {
if fact AppendArgs a && isEmpty(a.left) {
assert (new AppendResult(left: a.left, right: a.right, result: a.right));
}
}
rule pop {
if fact AppendArgs a && !isEmpty(a.left) && fact AppendResult r &&
isEqual(rest(a.left), r.left) && isEqual(a.right, r.right) {
assert(new AppendResult(
left: a.left, right: a.right,
result: cons(first(a.left), r.result)));
}
}
final List left = Arrays.asList(new String[]{"a", "b", "c"});
final List right = Arrays.asList(new String[]{"d", "e"});
assert(new AppendArgs(left: left, right: right));
rule printResult {
if fact AppendResult r && isEqual(r.left, left) && isEqual(r.right, right) {
println(r.result);
}
}
run();
//prints: [a, b, c, d, e]
Received on Thursday, 16 March 2006 17:53:15 UTC