Skip to content

Commit bc6c25d

Browse files
committed
Remove solutions that are identical up to permutation
1 parent b431d2b commit bc6c25d

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

HB/howto.elpi

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ pred union i:list A, i:list A, o:list A.
5050
union L1 L2 R :-
5151
std.fold L2 L1 (x\l\l'\if (std.mem l x) (l' = l) (l' = [x|l])) R.
5252

53+
pred insert-sorted i:(A -> A -> prop), i:A, i:list A, o:list A.
54+
insert-sorted _ X [] [X] :- !.
55+
insert-sorted Rel X [Y|T] [X,Y|T] :- Rel X Y, !.
56+
insert-sorted Rel X [Y|T] [Y|T'] :- insert-sorted Rel X T T', !.
57+
5358
pred lt-gref i:gref, i:gref.
5459
lt-gref X Y :-
5560
gref->modname_short X "." SX, gref->modname_short Y "." SY, !, SX s< SY.
@@ -97,23 +102,32 @@ pred paths-from-for-step i:list mixinname, i:list mixinname, i:int,
97102
o:list (list factoryname).
98103
paths-from-for-step MLSrc ML K R :-
99104
std.filter {list_factories} (fd\sigma pml\fd = fdp _ _ pml, incl pml ML) FL,
100-
paths-from-for-step-using MLSrc ML K FL R.
105+
paths-from-for-step-using MLSrc ML K [] [] FL _ R.
101106

102-
% [paths-from-for-step-using MLSrc ML K FL R]
107+
% [paths-from-for-step-using MLSrc ML K Pre KnownPre FL KnownPre' R]
103108
% same as [paths-from-for-step MLSrc ML K R] using only factories in [FL]
109+
% [Pre] is a (sorted) prefix that is looked into the list of known (sorted)
110+
% prefixes [KnownPre] to avoid generating identical solutions up to permutations
104111
pred paths-from-for-step-using i:list mixinname, i:list mixinname, i:int,
105-
i:list factory_deps_prov, o:list (list factoryname).
106-
paths-from-for-step-using _ _ K _ [] :- K i< 0.
107-
paths-from-for-step-using _ [] _ _ [[]] :- !.
108-
paths-from-for-step-using MLSrc ML K FL R :-
112+
i:list factoryname, i:list (list factoryname), i:list factory_deps_prov,
113+
o:list (list factoryname), o:list (list factoryname).
114+
paths-from-for-step-using _ _ K _ KnownPre _ KnownPre [] :- K i< 0.
115+
paths-from-for-step-using _ _ _ Pre KnownPre _ KnownPre [] :-
116+
std.mem KnownPre Pre, !.
117+
paths-from-for-step-using _ [] _ Pre KnownPre _ [Pre|KnownPre] [[]] :- !.
118+
paths-from-for-step-using MLSrc ML K Pre KnownPre FL [Pre|KnownPre'] R :-
109119
K' is K - 1,
110120
std.filter FL (p\sigma dml\p = fdp _ dml _, incl dml MLSrc) FLdep,
111-
std.fold FLdep [] (paths-from-for-step-using.aux MLSrc ML FL K') R.
112-
paths-from-for-step-using.aux MLSrc ML FL' K' (fdp F _ MLF) L R :-
121+
std.fold FLdep (pr KnownPre [])
122+
(paths-from-for-step-using.aux MLSrc ML FL K' Pre)
123+
(pr KnownPre' R).
124+
paths-from-for-step-using.aux MLSrc ML FL' K' Pre (fdp F _ MLF) (pr KnPre L)
125+
(pr KnPre' R) :-
113126
std.append MLSrc MLF MLSrc',
114127
list-diff ML MLF ML',
128+
insert-sorted lt-gref F Pre Pre',
115129
std.filter FL' (p\sigma pml\p = fdp _ _ pml, incl pml ML') FML',
116-
paths-from-for-step-using MLSrc' ML' K' FML' R',
130+
paths-from-for-step-using MLSrc' ML' K' Pre' KnPre FML' KnPre' R',
117131
std.map R' (l\r\r = [F|l]) R'',
118132
std.append L R'' R.
119133

tests/howto.v.out

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
77
- AddComoid_of_TYPE; AddAG_of_AddComoid; BiNearRing_of_AddMonoid
88
- AddComoid_of_TYPE; AddAG_of_AddComoid; Ring_of_AddAG
99
- AddComoid_of_TYPE; AddAG_of_AddComoid; SemiRing_of_AddComoid
10-
- AddComoid_of_TYPE; BiNearRing_of_AddMonoid; AddAG_of_AddComoid
11-
- AddComoid_of_TYPE; SemiRing_of_AddComoid; AddAG_of_AddComoid
1210
- AddMonoid_of_TYPE; AddComoid_of_AddMonoid; Ring_of_AddComoid
1311

1412
HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
@@ -27,8 +25,6 @@ HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
2725
- AddComoid_of_TYPE; AddAG_of_AddComoid; BiNearRing_of_AddMonoid
2826
- AddComoid_of_TYPE; AddAG_of_AddComoid; Ring_of_AddAG
2927
- AddComoid_of_TYPE; AddAG_of_AddComoid; SemiRing_of_AddComoid
30-
- AddComoid_of_TYPE; BiNearRing_of_AddMonoid; AddAG_of_AddComoid
31-
- AddComoid_of_TYPE; SemiRing_of_AddComoid; AddAG_of_AddComoid
3228
- AddMonoid_of_TYPE; AddComoid_of_AddMonoid; Ring_of_AddComoid
3329

3430
HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
@@ -45,8 +41,6 @@ HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
4541
- AddAG_of_AddComoid; BiNearRing_of_AddMonoid
4642
- AddAG_of_AddComoid; Ring_of_AddAG
4743
- AddAG_of_AddComoid; SemiRing_of_AddComoid
48-
- BiNearRing_of_AddMonoid; AddAG_of_AddComoid
49-
- SemiRing_of_AddComoid; AddAG_of_AddComoid
5044

5145
HB: solutions (use 'HB.about F.Build' to see the arguments of each factory F):
5246
- BiNearRing_of_AddMonoid

0 commit comments

Comments
 (0)