Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Irrelevance of Prop WIP #875

Merged
merged 12 commits into from
Jan 7, 2023
7 changes: 5 additions & 2 deletions base/src/main/java/org/aya/core/def/Def.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.aya.pretty.doc.Doc;
import org.aya.ref.DefVar;
import org.aya.util.prettier.PrettierOptions;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;
Expand All @@ -35,8 +36,10 @@ public sealed interface Def extends AyaDocile, GenericDef permits SubLevelDef, T
// guaranteed as this is already a core term
else return defVar.concrete.checkedBody;
}
static @NotNull Term defResult(@NotNull DefVar<? extends Def, ? extends Decl.Telescopic<?>> defVar) {
if (defVar.core != null) return defVar.core.result();
@SuppressWarnings("unchecked") @Contract(pure = true)
static <T extends Term> @NotNull T
defResult(@NotNull DefVar<? extends Def, ? extends Decl.Telescopic<? extends T>> defVar) {
if (defVar.core != null) return (T) defVar.core.result();
// guaranteed as this is already a core term
else return Objects.requireNonNull(defVar.concrete.signature()).result;
}
Expand Down
4 changes: 1 addition & 3 deletions base/src/main/java/org/aya/core/pat/PatToTerm.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ public Term visit(@NotNull Pat pat) {
protected @NotNull Term visitCtor(Pat.@NotNull Ctor ctor) {
var data = (DataCall) ctor.type();
var args = Arg.mapSeq(ctor.params(), this::visit);
return new ConCall(data.ref(), ctor.ref(),
data.args().map(Arg::implicitify),
data.ulift(), args);
return new ConCall(data.ref(), ctor.ref(), data.args(), data.ulift(), args);
}
}
12 changes: 6 additions & 6 deletions base/src/main/java/org/aya/core/pat/PatUnify.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.core.pat;

import kala.collection.SeqLike;
import kala.collection.SeqView;
import kala.collection.immutable.ImmutableSeq;
import org.aya.core.term.RefTerm;
import org.aya.core.visitor.Subst;
import org.aya.prettier.AyaPrettierOptions;
import org.aya.generic.util.InternalException;
import org.aya.prettier.AyaPrettierOptions;
import org.aya.pretty.doc.Doc;
import org.aya.ref.LocalVar;
import org.aya.tyck.env.LocalCtx;
Expand All @@ -18,7 +18,7 @@
* The unification of patterns. This is <strong>not</strong> pattern unification.
*
* @author ice1000
* @see PatUnify#unifyPat(SeqLike, SeqLike, Subst, Subst, LocalCtx)
* @see #unifyPat(SeqView, SeqView, Subst, Subst, LocalCtx)
*/
public record PatUnify(@NotNull Subst lhsSubst, @NotNull Subst rhsSubst, @NotNull LocalCtx ctx) {
private void unify(@NotNull Pat lhs, @NotNull Pat rhs) {
Expand Down Expand Up @@ -108,8 +108,8 @@ private static void unifyPat(Pat lhs, Pat rhs, Subst lhsSubst, Subst rhsSubst, L
* @see PatUnify#visitAs(LocalVar, org.aya.core.pat.Pat)
*/
public static @NotNull LocalCtx unifyPat(
@NotNull SeqLike<Pat> lpats,
@NotNull SeqLike<Pat> rpats,
@NotNull SeqView<Pat> lpats,
@NotNull SeqView<Pat> rpats,
@NotNull Subst lhsSubst,
@NotNull Subst rhsSubst,
@NotNull LocalCtx ctx
Expand Down
6 changes: 4 additions & 2 deletions base/src/main/java/org/aya/core/term/ConCall.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.core.term;

Expand Down Expand Up @@ -43,11 +43,13 @@ public ConCall(
}

@Override public @NotNull ImmutableSeq<Arg<@NotNull Term>> args() {
return head.dataArgs.view().concat(conArgs).toImmutableSeq();
return head.dataArgs.view().map(Arg::implicitify).concat(conArgs).toImmutableSeq();
}

/**
* @param dataArgs the arguments to the data type, NOT the constructor patterns!!
* They need to be turned implicit when used as arguments.
* @see org.aya.tyck.pat.PatternTycker#mischa
*/
public record Head(
@NotNull DefVar<DataDef, TeleDecl.DataDecl> dataRef,
Expand Down
5 changes: 2 additions & 3 deletions base/src/main/java/org/aya/core/term/SigmaTerm.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.core.term;

import kala.collection.immutable.ImmutableSeq;
import kala.collection.mutable.MutableArrayList;
import kala.collection.mutable.MutableList;
import kala.collection.mutable.MutableMap;
import org.aya.core.visitor.BetaExpander;
import org.aya.core.visitor.Subst;
import org.aya.generic.SortKind;
Expand Down Expand Up @@ -84,7 +83,7 @@ record Item(@NotNull CoeTerm coe, @NotNull Arg<Term> arg) {
public <T> @Nullable TupTerm check(@NotNull ImmutableSeq<? extends T> it, @NotNull BiFunction<T, Term, Term> inherit) {
var items = MutableList.<Arg<Term>>create();
var againstTele = params.view();
var subst = new Subst(MutableMap.create());
var subst = new Subst();
for (var iter = it.iterator(); iter.hasNext(); ) {
var item = iter.next();
var first = againstTele.first().subst(subst);
Expand Down
5 changes: 2 additions & 3 deletions base/src/main/java/org/aya/core/visitor/EndoTerm.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.core.visitor;

import kala.collection.mutable.MutableMap;
import org.aya.core.term.*;
import org.aya.generic.util.InternalException;
import org.aya.ref.AnyVar;
Expand Down Expand Up @@ -37,7 +36,7 @@ public interface EndoTerm extends UnaryOperator<Term> {
/** Not an IntelliJ Renamer. */
record Renamer(@NotNull Subst subst) implements EndoTerm {
public Renamer() {
this(new Subst(MutableMap.create()));
this(new Subst());
}

private @NotNull Term.Param handleBinder(@NotNull Term.Param param) {
Expand Down
9 changes: 5 additions & 4 deletions base/src/main/java/org/aya/core/visitor/Subst.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.core.visitor;

import kala.collection.SeqLike;
import kala.collection.immutable.ImmutableSeq;
import kala.collection.mutable.MutableHashMap;
import kala.collection.mutable.MutableLinkedHashMap;
import kala.collection.mutable.MutableMap;
import kala.collection.mutable.MutableTreeMap;
import org.aya.core.term.FormulaTerm;
import org.aya.core.term.RefTerm;
import org.aya.core.term.Term;
import org.aya.prettier.BasePrettier;
import org.aya.generic.AyaDocile;
import org.aya.generic.util.NormalizeMode;
import org.aya.guest0x0.cubical.CofThy;
import org.aya.guest0x0.cubical.Formula;
import org.aya.guest0x0.cubical.Restr;
import org.aya.prettier.BasePrettier;
import org.aya.pretty.doc.Doc;
import org.aya.ref.AnyVar;
import org.aya.ref.LocalVar;
Expand All @@ -41,15 +42,15 @@ public record Subst(
}));

public Subst() {
this(MutableMap.create());
this(MutableLinkedHashMap.of());
}

public Subst(@NotNull AnyVar var, @NotNull Term term) {
this(MutableHashMap.of(var, term));
}

public Subst(@NotNull SeqLike<LocalVar> from, @NotNull SeqLike<? extends Term> to) {
this(MutableMap.from(from.zipView(to)));
this(MutableLinkedHashMap.from(from.zipView(to)));
}

public void subst(@NotNull Subst subst) {
Expand Down
4 changes: 3 additions & 1 deletion base/src/main/java/org/aya/tyck/StmtTycker.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.aya.tyck.pat.ClauseTycker;
import org.aya.tyck.pat.Conquer;
import org.aya.tyck.pat.PatClassifier;
import org.aya.tyck.pat.YouTrack;
import org.aya.tyck.trace.Trace;
import org.aya.tyck.tycker.TracedTycker;
import org.aya.util.Arg;
Expand Down Expand Up @@ -89,7 +90,8 @@ public StmtTycker(@NotNull Reporter reporter, Trace.@Nullable Builder traceBuild
def = factory.apply(result.result(), Either.right(result.matchings()));
if (!result.hasLhsError()) {
tracing(builder -> builder.shift(new Trace.LabelT(pos, "confluence check")));
PatClassifier.confluence(result, tycker, pos,
var confluence = new YouTrack(signature.param(), tycker, pos);
confluence.check(result,
PatClassifier.classify(result.clauses(), signature.param(), tycker, pos));
tracing(TreeBuilder::reduce);
}
Expand Down
17 changes: 10 additions & 7 deletions base/src/main/java/org/aya/tyck/pat/Conquer.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2020-2022 Tesla (Yinsen) Zhang.
// Copyright (c) 2020-2023 Tesla (Yinsen) Zhang.
// Use of this source code is governed by the MIT license that can be found in the LICENSE.md file.
package org.aya.tyck.pat;

Expand All @@ -11,14 +11,15 @@
import org.aya.core.term.MetaTerm;
import org.aya.core.term.Term;
import org.aya.core.visitor.AyaRestrSimplifier;
import org.aya.core.visitor.DeltaExpander;
import org.aya.core.visitor.Subst;
import org.aya.generic.util.NormalizeMode;
import org.aya.guest0x0.cubical.CofThy;
import org.aya.guest0x0.cubical.Partial;
import org.aya.guest0x0.cubical.Restr;
import org.aya.tyck.ExprTycker;
import org.aya.tyck.env.MapLocalCtx;
import org.aya.tyck.error.UnifyInfo;
import org.aya.tyck.tycker.UnifiedTycker;
import org.aya.util.Arg;
import org.aya.util.error.SourcePos;
import org.jetbrains.annotations.NotNull;
Expand All @@ -33,11 +34,11 @@ public record Conquer(
@NotNull ImmutableSeq<Term.Matching> matchings,
@NotNull SourcePos sourcePos,
boolean orderIndependent,
@NotNull ExprTycker tycker
@NotNull UnifiedTycker tycker
) {
public static void against(
@NotNull FnDef def, boolean orderIndependent,
@NotNull ExprTycker tycker, @NotNull SourcePos pos
@NotNull UnifiedTycker tycker, @NotNull SourcePos pos
) {
var matchings = def.body.getRightValue();
var conquer = new Conquer(def, matchings, pos, orderIndependent, tycker);
Expand Down Expand Up @@ -84,11 +85,13 @@ private void checkConditions(int nth, int i, Restr.Side<Term> condition, Subst m
var matchResult = new FnCall(def.ref, 0, args).normalize(tycker.state, NormalizeMode.WHNF).subst(subst);
currentClause.patterns().forEach(p -> p.term().storeBindings(ctx, subst));
if (newBody instanceof ErrorTerm error && error.description() instanceof MetaTerm hole) {
hole.ref().conditions.append(Tuple.of(matchy, matchResult));
hole.ref().conditions.append(Tuple.of(subst, matchResult));
} else if (matchResult instanceof ErrorTerm error && error.description() instanceof MetaTerm hole) {
hole.ref().conditions.append(Tuple.of(matchy, newBody));
hole.ref().conditions.append(Tuple.of(subst, newBody));
}
return tycker.unifyReported(newBody, matchResult, def.result.subst(matchy),
var retSubst = DeltaExpander.buildSubst(def.telescope, args);
retSubst.add(subst);
return tycker.unifyReported(newBody, matchResult, def.result.subst(retSubst),
sourcePos, ctx, comparison -> new ClausesProblem.Conditions(
sourcePos, currentClause.sourcePos(), nth + 1, i, args, new UnifyInfo(tycker.state), comparison));
});
Expand Down
52 changes: 0 additions & 52 deletions base/src/main/java/org/aya/tyck/pat/PatClassifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,14 @@
import kala.collection.SeqView;
import kala.collection.immutable.ImmutableSeq;
import kala.collection.mutable.MutableList;
import kala.collection.mutable.MutableMap;
import kala.tuple.Tuple;
import kala.tuple.primitive.IntObjTuple2;
import kala.value.MutableValue;
import org.aya.concrete.Pattern;
import org.aya.core.def.Def;
import org.aya.core.pat.Pat;
import org.aya.core.pat.PatUnify;
import org.aya.core.term.*;
import org.aya.core.visitor.Subst;
import org.aya.generic.util.NormalizeMode;
import org.aya.ref.AnyVar;
import org.aya.tyck.ExprTycker;
import org.aya.tyck.env.LocalCtx;
import org.aya.tyck.error.TyckOrderError;
import org.aya.tyck.error.UnifyInfo;
import org.aya.tyck.tycker.StatedTycker;
import org.aya.tyck.tycker.TyckState;
import org.aya.util.Arg;
Expand Down Expand Up @@ -90,50 +82,6 @@ public static int[] firstMatchDomination(
return numbers;
}

public static void confluence(
@NotNull ClauseTycker.PatResult clauses,
@NotNull ExprTycker tycker, @NotNull SourcePos pos,
@NotNull MCT<Term, PatErr> mct
) {
var result = clauses.result();
mct.forEach(results -> {
var contents = results.contents()
.flatMap(i -> Pat.Preclause.lift(clauses.clauses().get(i))
.map(matching -> IntObjTuple2.of(i, matching)));
for (int i = 1, size = contents.size(); i < size; i++) {
var lhsInfo = contents.get(i - 1);
var rhsInfo = contents.get(i);
var lhsSubst = new Subst(MutableMap.create());
var rhsSubst = new Subst(MutableMap.create());
var ctx = PatUnify.unifyPat(lhsInfo.component2().patterns().map(Arg::term), rhsInfo.component2().patterns().map(Arg::term),
lhsSubst, rhsSubst, tycker.ctx.deriveMap());
domination(ctx, rhsSubst, tycker.reporter, lhsInfo.component1(), rhsInfo.component1(), rhsInfo.component2());
domination(ctx, lhsSubst, tycker.reporter, rhsInfo.component1(), lhsInfo.component1(), lhsInfo.component2());
var lhsTerm = lhsInfo.component2().body().subst(lhsSubst);
var rhsTerm = rhsInfo.component2().body().subst(rhsSubst);
// TODO: Currently all holes at this point are in an ErrorTerm
if (lhsTerm instanceof ErrorTerm error && error.description() instanceof MetaTerm hole) {
hole.ref().conditions.append(Tuple.of(lhsSubst, rhsTerm));
} else if (rhsTerm instanceof ErrorTerm error && error.description() instanceof MetaTerm hole) {
hole.ref().conditions.append(Tuple.of(rhsSubst, lhsTerm));
}
tycker.unifyReported(lhsTerm, rhsTerm, result, pos, ctx, comparison ->
new ClausesProblem.Confluence(pos, rhsInfo.component1() + 1, lhsInfo.component1() + 1,
comparison, new UnifyInfo(tycker.state), rhsInfo.component2().sourcePos(), lhsInfo.component2().sourcePos()));
}
});
}

private static void domination(
LocalCtx ctx, Subst rhsSubst, Reporter reporter,
int lhsIx, int rhsIx, Term.Matching matching
) {
if (rhsSubst.map().valuesView().allMatch(dom ->
dom instanceof RefTerm(var ref) && ctx.contains(ref))
) reporter.report(new ClausesProblem.Domination(
lhsIx + 1, rhsIx + 1, matching.sourcePos()));
}

private @NotNull MCT<Term, PatErr> classifySub(
@NotNull SeqView<Term.Param> telescope,
@NotNull ImmutableSeq<MCT.SubPats<Pat>> clauses,
Expand Down
2 changes: 1 addition & 1 deletion base/src/main/java/org/aya/tyck/pat/PatternTycker.java
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ public static Result<Subst, Boolean> mischa(DataCall dataCall, CtorDef ctor, @No
if (ctor.pats.isNotEmpty()) {
return PatMatcher.tryBuildSubst(true, ctor.pats, dataCall.args(), new Expander.WHNFer(state));
} else {
return kala.control.Result.ok(DeltaExpander.buildSubst(Def.defTele(dataCall.ref()), dataCall.args()));
return Result.ok(DeltaExpander.buildSubst(Def.defTele(dataCall.ref()), dataCall.args()));
}
}

Expand Down
Loading