Lisp

Programmer

博客园 首页 新随笔 联系 订阅 管理
1. Test For Existence

     foobar(elt, (x . y)) :-
                      foo(elt, x).
     foobar(elt, (x . y)) :-
                      foobar(elt, y).

For example, the familiar <member> function can be written as:
     member(elt, (x . y)) :-
                     elt == x.
     member(elt, (x . y)) :-
                     member(elt, y).

2. Test For All Elements

     foobar(elt, ()).
     foobar(elt, (x . y)) :-
                     foo(elt, x),
                     foobar(elt, y).

For example, <all-digits>, which tests if all elemnts of a list are digits, can be written as:
     all-digits(()).
     all-digits((x . y) :-
                    member(x, (1,2,3,4,5,6,7,8,9,0)),
                    all-digits(y).

3. Return a Result -- Having processed ONE element

      foobar(foo, (x . y), Result) :-
                    foo(x),
                    result(x, y, Result)..
      foobar(foo, (x . y), Result) :-
                    foobar(foo, y, Result).

For example, <tail-after-a>, which returns sublist after a, can be written as:
      tail-after-a((x . y), result) :-
                     x == a,
                     result = y.
      tail-after-a((x . y), result) :-
                     tail-after-a(y, result).

4. Return a Result -- Having processed ALL elements

       foobar(foo, (), ()).
       foobar(foo, (x . y), (a . b)) :-
                    foo(x, a),
                    foobar(foo, y, b).

For example, <double>, which doubles every element in a list, can be written as:
       double((), ()).
       double((x . y), (a . b)) :-
                    a is 2 * x,
                    double(y, b).

Footnote: note the difference of building structure in the clause head and clause body.
posted on 2006-04-03 15:26  fei  阅读(206)  评论(0编辑  收藏  举报