I try to make the meaning of 'children' accurate and consistent:
return value of 'children' should not contain empty aggregate.


diff --git a/ChangeLog b/ChangeLog
index cb3e6139..bd671a6e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-15  Qian Yun  <[email protected]>
+
+       * src/algebra/aggcat.spad, src/algebra/stream.spad,
+       src/algebra/tree.spad: fix 'children' in List, Stream and Tree
+
  2018-11-14  Qian Yun  <[email protected]>

         * src/algebra/aggcat.spad: fix 'children' in BRAGG
diff --git a/src/algebra/aggcat.spad b/src/algebra/aggcat.spad
index e16526d6..f7cf5ecb 100644
--- a/src/algebra/aggcat.spad
+++ b/src/algebra/aggcat.spad
@@ -1054,13 +1054,14 @@
  ++ a directed graph containing values of type S.
  ++ Recursively, a recursive aggregate is either empty or a {\em node}
  ++ consisting of a \spadfun{value} from S and 0 or more \spadfun{children}
-++ which are recursive aggregates.
+++ which are also nodes.
  ++ A node with no children is called a \spadfun{leaf} node.
  ++ A recursive aggregate may be cyclic for which some operations as noted
  ++ may go into an infinite loop.
  RecursiveAggregate(S : Type) : Category == HomogeneousAggregate(S) with
     children : % -> List %
       ++ children(u) returns a list of the children of aggregate u.
+     ++ Returns \spad{empty()} if u is empty aggregate.
     -- should be % -> %* and also needs children: % -> Iterator(S, S)
     nodes : % -> List %
       ++ nodes(u) returns a list of all of the nodes of aggregate u.
@@ -1299,7 +1300,6 @@
  ++ A node with one children models a non-empty list, with the
  ++ \spadfun{value} of the list designating the head, or
\spadfun{first}, of the
  ++ list, and the child designating the tail, or \spadfun{rest}, of the
list.
-++ A node with no child then designates the empty list.
  ++ Since these aggregates are recursive aggregates, they may be cyclic.
  UnaryRecursiveAggregate(S : Type) : Category == RecursiveAggregate S with
     concat : (%, %) -> %
@@ -1421,7 +1421,7 @@
        reverse! l

    children x ==
-      empty? x => empty()
+      empty? x or empty? rest x => empty()
        [rest x]

    leaf? x ==
diff --git a/src/algebra/stream.spad b/src/algebra/stream.spad
index 33cffce1..c21cc581 100644
--- a/src/algebra/stream.spad
+++ b/src/algebra/stream.spad
@@ -325,7 +325,7 @@
        x = rst y

    children x ==
-    empty? x => error "children: no children"
+    empty? x or empty? rst x => empty()
      [rst x]

    distance(x, z) ==
diff --git a/src/algebra/tree.spad b/src/algebra/tree.spad
index c58aae21..213b20c1 100644
--- a/src/algebra/tree.spad
+++ b/src/algebra/tree.spad
@@ -42,7 +42,7 @@
      empty()  == ["empty"]

      children t ==
-      t case empty => error "cannot take the children of an empty tree"
+      t case empty => empty()
        (t.node.args)@List(%)
      setchildren!(t, lt) ==
        t case empty => error "cannot set children of an empty tree"
diff --git a/src/input/bugs2018.input b/src/input/bugs2018.input
index e08adf3d..adfb8054 100644
--- a/src/input/bugs2018.input
+++ b/src/input/bugs2018.input
@@ -199,4 +199,12 @@

  testTrue("empty? children binarySearchTree [1]")

+testcase "'children' in List, Stream and Tree"
+
+testTrue("empty? children [1]")
+
+testTrue("empty? children([1]@Stream Integer)")
+
+testTrue("empty? children(empty()$Tree Integer)")
+
  statistics()

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/fricas-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to