- From: Gary Hallmark <gary.hallmark@oracle.com>
- Date: Thu, 16 Mar 2006 10:05:04 -0800
- To: public-rif-wg@w3.org
The problem with ad hoc languages is you have to do your own type checking. That 3rd rule should be appendArgs([H|T], X), appendResult(T, X, R) -> appendResult([H|T], X, [H|R]) Gary Hallmark wrote: > 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 18:05:27 UTC