(xs []ast.BaseTerm, ys []ast.BaseTerm)
| 32 | } |
| 33 | |
| 34 | func (u *unionFindFun) unifyFunctional(xs []ast.BaseTerm, ys []ast.BaseTerm) error { |
| 35 | for i, x := range xs { |
| 36 | y := ys[i] |
| 37 | xApply, xOk := x.(ast.ApplyFn) |
| 38 | yApply, yOk := y.(ast.ApplyFn) |
| 39 | if !xOk && !yOk { |
| 40 | if x.Equals(ast.Variable{"_"}) || y.Equals(ast.Variable{"_"}) { |
| 41 | continue |
| 42 | } |
| 43 | u.ufrel.parent[x] = x |
| 44 | u.ufrel.parent[y] = y |
| 45 | unifyTermsUpdate([]ast.BaseTerm{x}, []ast.BaseTerm{y}, u.ufrel) |
| 46 | continue |
| 47 | } |
| 48 | if yOk && !xOk { |
| 49 | xApply = yApply |
| 50 | y = x |
| 51 | xOk, yOk = true, false |
| 52 | } |
| 53 | if xOk && !yOk { |
| 54 | yVar, yOk := y.(ast.Variable) |
| 55 | if !yOk { |
| 56 | return fmt.Errorf("cannot unify %v and %v", x, y) |
| 57 | } |
| 58 | if yExisting := u.ufrel.find(yVar); yExisting != nil && !yExisting.Equals(xApply) { |
| 59 | return fmt.Errorf("cannot unify %v and %v", x, yExisting) |
| 60 | } |
| 61 | |
| 62 | u.subst[yVar] = xApply |
| 63 | continue |
| 64 | } |
| 65 | if xApply.Function != yApply.Function { |
| 66 | return fmt.Errorf("cannot unify %v and %v", xApply, yApply) |
| 67 | } |
| 68 | if err := u.unifyFunctional(xApply.Args, yApply.Args); err != nil { |
| 69 | return err |
| 70 | } |
| 71 | } |
| 72 | return nil |
| 73 | } |
no test coverage detected