home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / LIB / TERMS.LF < prev    next >
Text File  |  1996-06-04  |  2KB  |  113 lines

  1. %    $Id: terms.lf,v 1.2 1994/12/09 00:25:37 duchier Exp $    
  2. module("terms") ?
  3.  
  4.  
  5. import("expanders") ?
  6.  
  7. add_man(terms,
  8.     " module(""terms"")
  9.  
  10.   utilities for term manipulation:
  11.  
  12.   feature_values,add_features,share_features") ?
  13.  
  14.  
  15.  
  16.  
  17. %%%add_man(feature_values,
  18. %%%    "feature_values(Term) -> List.
  19.  
  20. %%%  input : Term: a psi-term;
  21. %%%  output: List: the list of its arguments.")?
  22.  
  23. %%%public(feature_values) ?
  24. %%%feature_values(Term) -> feature_values2(features(Term),Term).
  25. %%%feature_values2(F1,Term) ->& Term.F1 ?
  26.  
  27. %%% made a C built-in: BD 3.3.94
  28.   
  29. add_man(add_features,
  30.     "add_features(List,Term)?
  31.  
  32.   input : Term: a psi-term;
  33.           List: a list of feature names
  34.   output: Term
  35.  
  36.   The features in List are added to Term")?
  37.  
  38. public(add_features) ?
  39. add_features(F,Term) :-& Term.F = @ ?
  40.  
  41.  
  42.  
  43. add_man(share_features,
  44.     "share_features(List,Term1,Term2)?
  45.  
  46.   input : Term1,Term2: psi-terms;
  47.           List: a list of feature names
  48.   output: Term1,Term2
  49.  
  50.   After execution, the features in List are shared by Term1 and Term2")?
  51.  
  52. public(share_features) ?
  53. share_features(F,Term1,Term2) :-& Term1.F = Term2.F ?
  54.  
  55.  
  56.  
  57.  
  58. add_man(remove_feature,
  59.     "remove_feature(Term,Feature)?
  60.  
  61.   input : Term,Feature
  62.   output: Term
  63.  
  64.   Removes 'Feature' from 'Term' if present.")?
  65.  
  66. public(remove_feature)?
  67.  
  68.  
  69. remove_feature(F,T) :-
  70.     remove_feature_loop(features(T),F,T,V),
  71.     T<-root_sort(T)&V.
  72.  
  73. remove_feature_loop(X,F,T,V) :-& (X:==F,!;V.X=T.X) ?
  74.  
  75.  
  76.  
  77.  
  78.  
  79. add_man(term_size,
  80.     "N=term_size(Term)?
  81.  
  82.   input : Term
  83.   output: N
  84.  
  85.   Counts the number of nodes in a given psi-term.")?
  86.  
  87. public(term_size)?
  88.  
  89. sum([V|Vs]) -> V+sum(Vs).
  90. sum([]) -> 0.
  91.  
  92.  
  93. term_size(X) -> N |
  94.     V<<-@,                               % Create a persistent term for the
  95.                       % result.
  96.     
  97.     (    V<<-count_and_explore(X), % Calculate the size.
  98.         fail              % Remove all the calculation.
  99.     ;
  100.         N=copy_term(V)          % Copy the result back to a normal
  101.     ).                  % logical term.
  102.  
  103.  
  104. count_and_explore(X) -> V |
  105.     (    X:==already_seen,      % Don't loop over cyclic terms.
  106.         !,
  107.         V=0
  108.     ;
  109.         FV=feature_values(X),      % Get the features of X.
  110.         X<-already_seen,      % Mark X as having been counted.
  111.         V=1+sum(map(count_and_explore,FV))
  112.     ).
  113.