fn solve_via_implication(
        &mut self,
        binders: &[ParameterKind<UniverseIndex>],
        goal: InEnvironment<DomainGoal>,
        clause: Binders<ProgramClauseImplication>
    ) -> Result<Solution> {
        let mut fulfill = Fulfill::new(self);
        let subst = Substitution::from_binders(&binders);
        let (goal, (clause, subst)) =
            fulfill.instantiate(binders.iter().cloned(), &(goal, (clause, subst)));
        let ProgramClauseImplication { consequence, conditions } =
            fulfill.instantiate_in(goal.environment.universe, clause.binders, &clause.value);

        fulfill.unify(&goal.environment, &goal.goal, &consequence)?;

        // if so, toss in all of its premises
        for condition in conditions {
            fulfill.push_goal(&goal.environment, condition);
        }

        // and then try to solve
        fulfill.solve(subst)
    }
/// Modus ponens! That is: try to apply an implication by proving its premises.
Modus ponens. That is: try to apply an implication by proving its premises.
Modus ponens . That is : try to apply an implication by proving its premises .
fn solve_via_implication(
        &mut self,
        binders: &[ParameterKind<UniverseIndex>],
        goal: InEnvironment<DomainGoal>,
        clause: Binders<ProgramClauseImplication>
    ) -> Result<Solution> {
        let mut fulfill = Fulfill::new(self);
        let subst = Substitution::from_binders(&binders);
        let (goal, (clause, subst)) =
            fulfill.instantiate(binders.iter().cloned(), &(goal, (clause, subst)));
        let ProgramClauseImplication { consequence, conditions } =
            fulfill.instantiate_in(goal.environment.universe, clause.binders, &clause.value);
        fulfill.unify(&goal.environment, &goal.goal, &consequence)?;
        // if so, toss in all of its premises
        for condition in conditions {
            fulfill.push_goal(&goal.environment, condition);
        }
        // and then try to solve
        fulfill.solve(subst)
    }
fn solve_via_implication ( & mut self , binders : & [ ParameterKind < UniverseIndex > ] , goal : InEnvironment < DomainGoal > , clause : Binders < ProgramClauseImplication > ) -> Result < Solution > { let mut fulfill = Fulfill :: new ( self ) ; let subst = Substitution :: from_binders ( & binders ) ; let ( goal , ( clause , subst ) ) = fulfill . instantiate ( binders . iter ( ) . cloned ( ) , & ( goal , ( clause , subst ) ) ) ; let ProgramClauseImplication { consequence , conditions } = fulfill . instantiate_in ( goal . environment . universe , clause . binders , & clause . value ) ; fulfill . unify ( & goal . environment , & goal . goal , & consequence ) ? ; // if so, toss in all of its premises for condition in conditions { fulfill . push_goal ( & goal . environment , condition ) ; } // and then try to solve fulfill . solve ( subst ) }
Modus ponens!
Modus ponens!
&mut self
binders
&[ParameterKind<UniverseIndex>]
goal
InEnvironment<DomainGoal>
clause
Binders<ProgramClauseImplication>