Skip to content

Update <:AbstractRuleNode equivalences #47

@THinnerichs

Description

@THinnerichs

HerbCore defines equivalence of anything <: AbstractRuleNode as follows:

➜  HerbCore git:(master) grep -rnw '.' -e 'Base'
...
./src/rulenode.jl:155:Base.:(==)(::RuleNode, ::AbstractHole) = false
./src/rulenode.jl:156:Base.:(==)(::AbstractHole, ::RuleNode) = false
./src/rulenode.jl:157:function Base.:(==)(A::RuleNode, B::RuleNode)
./src/rulenode.jl:163:Base.:(==)(A::AbstractHole, B::AbstractHole) = false
...
Source

HerbCore.jl/src/rulenode.jl

Lines 209 to 217 in 7bc381b

Base.:(==)(::RuleNode, ::AbstractHole) = false
Base.:(==)(::AbstractHole, ::RuleNode) = false
function Base.:(==)(A::RuleNode, B::RuleNode)
(A.ind == B.ind) &&
length(A.children) == length(B.children) && #required because zip doesn't check lengths
all(isequal(a, b) for (a, b) in zip(A.children, B.children))
end
# We do not know how the holes will be expanded yet, so we cannot assume equality even if the domains are equal.
Base.:(==)(A::AbstractHole, B::AbstractHole) = false

Specifically, Holes are never equal.

This is overwritten in HerbConstraints for StateHole with proper definitions)

./src/solver/uniform_solver/state_hole.jl:88:function Base.:(==)(A::StateHole, B::StateHole)
./src/solver/uniform_solver/state_hole.jl:95:function Base.:(==)(A::RuleNode, B::StateHole)
./src/solver/uniform_solver/state_hole.jl:102:function Base.:(==)(A::StateHole, B::RuleNode)
Source

https://github.com/Herb-AI/HerbConstraints.jl/blob/26275e2a8bf99168ac45ab6a63644b4c62dca0fc/src/solver/uniform_solver/state_hole.jl#L88-L107

function Base.:(==)(A::StateHole, B::StateHole)
	isfilled(A) && isfilled(B) &&
    	(get_rule(A) == get_rule(B)) && 
		(length(A.children) == length(B.children)) &&
		all(isequal(a, b) for (a, b) in zip(A.children, B.children))
end


function Base.:(==)(A::RuleNode, B::StateHole)
	isfilled(B) &&
    	(get_rule(A) == get_rule(B)) && 
		(length(A.children) == length(B.children)) &&
		all(isequal(a, b) for (a, b) in zip(A.children, B.children))
end


function Base.:(==)(A::StateHole, B::RuleNode)
	isfilled(A) &&
    	(get_rule(A) == get_rule(B)) && 
		(length(A.children) == length(B.children)) &&
		all(isequal(a, b) for (a, b) in zip(A.children, B.children))
end

Metadata

Metadata

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions