Se necesita ayuda para crear una tabla de verdad dada de árbol binario

Primero, para proporcionar una divulgación completa, quiero señalar que esto está relacionado con la tarea en una clase de Aprendizaje Automático. Esta pregunta no es la tarea de la tarea y, en cambio, es algo que debo resolver para completar el mayor problema de la creación de un algoritmo de árbol de decisión ID3.

Necesito generar un árbol similar al siguiente cuando se me da una tabla de verdad

let learnedTree = Node(0,"A0", Node(2,"A2", Leaf(0), Leaf(1)), Node(1,"A1", Node(2,"A2", Leaf(0), Leaf(1)), Leaf(0)))

learnTree es de tipo BinaryTree que he definido de la siguiente manera:

type BinaryTree =
    | Leaf of int
    | Node of int * string * BinaryTree * BinaryTree

Los algoritmos ID3 toman en cuenta varias ecuaciones para determinar dónde dividir el árbol, y tengo todo lo resuelto, solo estoy teniendo problemas para crear el árbol aprendido de mi tabla de verdad. Por ejemplo si tengo la siguiente tabla

A1 | A2 | A3 | Class
1     0    0      1
0     1    0      1
0     0    0      0
1     0    1      0
0     0    0      0
1     1    0      1
0     1    1      0

Y decido dividirme en el atributo A1, terminaría con lo siguiente:

              (A1 = 1)  A1   (A1 = 0)
   A2 | A3 | Class                A2 | A3 | Class
   0     0      1                1      0      1
   0     1      0                0      0      0
   1     0      1                0      0      0
                                 0      1      1

Luego dividiría el lado izquierdo y el lado derecho, y continuaría el patrón recursivo hasta que los nodos de la hoja estén puros y termine con un árbol similar al siguiente en función de la división.

let learnedTree = Node(0,"A0", Node(2,"A2", Leaf(0), Leaf(1)), Node(1,"A1", Node(2,"A2", Leaf(0), Leaf(1)), Leaf(0)))

Esto es lo que "piratearon" hasta ahora, pero creo que podría estar muy lejos:

let rec createTree (listToSplit : list<list<float>>) index =
    let leftSideSplit =
        listToSplit |> List.choose (fun x -> if x.Item(index) = 1. then Some(x) else None)
    let rightSideSplit =
        listToSplit |> List.choose (fun x -> if x.Item(index) = 0. then Some(x) else None)
    if leftSideSplit.Length > 0 then
        let pureCheck = isListPure leftSideSplit
        if pureCheck = 0 then
            printfn "%s" "Pure left node class 0"
            createTree leftSideSplit (index + 1)
        else if pureCheck = 1 then
            printfn "%s" "Pure left node class 1"
            createTree leftSideSplit (index + 1)
        else
            printfn "%s - %A" "Recursing Left" leftSideSplit
            createTree leftSideSplit (index + 1)
    else printfn "%s" "Pure left node class 0"

¿Debería estar utilizando la coincidencia de patrones en su lugar? ¿Algún consejo / ideas / ayuda? ¡Gracias un montón!

Respuestas a la pregunta(3)

Su respuesta a la pregunta