Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 23 |
Nodes: | 6 (0 / 6) |
Uptime: | 49:43:06 |
Calls: | 583 |
Files: | 1,138 |
Messages: | 111,301 |
Hi,
Functional requirement:
?- Y = g(_,_), X = f(Y,C,D,Y), term_singletons(X, L),
-a-a L == [C,D].
?- Y = g(A,X,B), X = f(Y,C,D), term_singletons(X, L),
-a-a L == [A,B,C,D].
Non-Functional requirement:
?- member(N,[5,10,15]), time(singletons(N)), fail; true.
% Zeit 1 ms, GC 0 ms, Lips 4046000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1352000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1355333, Uhr 11.08.2025 01:36
true.
Can your Prolog system do that?
P.S.: Benchmark was:
singletons(N) :-
-a-a hydra2(N,Y),
-a-a between(1,1000,_), term_singletons(Y,_), fail; true.
hydra2(0, _) :- !.
hydra2(N, s(X,X)) :-
-a-a M is N-1,
-a-a hydra2(M, X).
Bye
Hi,
While the rep() approach leads automatically
to total orders. As was already seen in MerciorCOs
Algorithm where rep(A) = ArCO. We can also arrange
that it leads to natural orders that are
conservative, using the DushnikrCo
Miller theorem:
DushnikrCoMiller theorem
Countable linear orders have non-identity order self-embeddings. https://en.wikipedia.org/wiki/Dushnik%E2%80%93Miller_theorem
I guess the theorem can be proved
with a Hilbert Hotel argument?
Here are some examples, works for terms that
donrCOt use '$VAR'/1 with a negative index, using
in fact an identity self-embedding on acyclic terms:
?- X = f(f(f(X))), naish(X,A).
X = f(f(f(X))),
A = f(f(f(S_3))).
?- X = s(Y,0), Y = s(X,1), naish(X,A), naish(Y,B).
X = s(s(X, 1), 0),
Y = s(X, 1),
A = s(s(S_2, 1), 0),
B = s(s(S_2, 0), 1).
naish/2 is named after Lee Naish, we use a
variant with deBruijn indexes:
naish(X, Y) :-
-a-a naish([], X, Y).
naish(_, X, X) :- var(X), !.
naish(S, X, Z) :- compound(X),
-a-a nth1(N, S, Y), same_term(X, Y), !,
-a-a M is -N,
-a-a Z = '$VAR'(M).
naish(S, X, Y) :- compound(X), !,
-a-a X =.. [F|L],
-a-a maplist(naish([X|S]), L, R),
-a-a Y =.. [F|R].
naish(_, X, X).
Bye
Mild Shock schrieb:
Hi,
Functional requirement:
?- Y = g(_,_), X = f(Y,C,D,Y), term_singletons(X, L),
-a-a-a L == [C,D].
?- Y = g(A,X,B), X = f(Y,C,D), term_singletons(X, L),
-a-a-a L == [A,B,C,D].
Non-Functional requirement:
?- member(N,[5,10,15]), time(singletons(N)), fail; true.
% Zeit 1 ms, GC 0 ms, Lips 4046000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1352000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1355333, Uhr 11.08.2025 01:36
true.
Can your Prolog system do that?
P.S.: Benchmark was:
singletons(N) :-
-a-a-a hydra2(N,Y),
-a-a-a between(1,1000,_), term_singletons(Y,_), fail; true.
hydra2(0, _) :- !.
hydra2(N, s(X,X)) :-
-a-a-a M is N-1,
-a-a-a hydra2(M, X).
Bye
Hi,
Now we can procceed an define:
structure_compare(C, X, Y) :-
-a-a-a naish(X, A),
-a-a-a naish(Y, B),
-a-a-a compare(C, A, B),
canonical_compare(C, X, Y) :-
-a-a-a moore(X, A),
-a-a-a moore(Y, B),
-a-a-a structure_compare(C, A, B).
The predicate structural_compare/3 does
not respect (==)/2 on cyclic terms. While
the predicate canonical_compare/3 does
respect (==)/2 on cyclic terms. Here some
example queries, showing the (==)/2 behaviour:
?- X = f(f(f(X))), Y = f(f(Y)), structure_compare(C, X, Y).
C = (>).
?- X = f(f(f(X))), Y = f(f(Y)), canonical_compare(C, X, Y).
C = (=).
And the Mats Carlson pair for demonstration:
?- X = s(Y,0), Y = s(X,1), stucture_compare(C, X, Y).
C = (>).
?- X = s(Y,0), Y = s(X,1), canonical_compare(C, X, Y).
C = (>).
Bye
Mild Shock schrieb:
Hi,
While the rep() approach leads automatically
to total orders. As was already seen in MerciorCOs
Algorithm where rep(A) = ArCO. We can also arrange
that it leads to natural orders that are
conservative, using the DushnikrCo
Miller theorem:
DushnikrCoMiller theorem
Countable linear orders have non-identity order self-embeddings.
https://en.wikipedia.org/wiki/Dushnik%E2%80%93Miller_theorem
I guess the theorem can be proved
with a Hilbert Hotel argument?
Here are some examples, works for terms that
donrCOt use '$VAR'/1 with a negative index, using
in fact an identity self-embedding on acyclic terms:
?- X = f(f(f(X))), naish(X,A).
X = f(f(f(X))),
A = f(f(f(S_3))).
?- X = s(Y,0), Y = s(X,1), naish(X,A), naish(Y,B).
X = s(s(X, 1), 0),
Y = s(X, 1),
A = s(s(S_2, 1), 0),
B = s(s(S_2, 0), 1).
naish/2 is named after Lee Naish, we use a
variant with deBruijn indexes:
naish(X, Y) :-
-a-a-a naish([], X, Y).
naish(_, X, X) :- var(X), !.
naish(S, X, Z) :- compound(X),
-a-a-a nth1(N, S, Y), same_term(X, Y), !,
-a-a-a M is -N,
-a-a-a Z = '$VAR'(M).
naish(S, X, Y) :- compound(X), !,
-a-a-a X =.. [F|L],
-a-a-a maplist(naish([X|S]), L, R),
-a-a-a Y =.. [F|R].
naish(_, X, X).
Bye
Mild Shock schrieb:
Hi,
Functional requirement:
?- Y = g(_,_), X = f(Y,C,D,Y), term_singletons(X, L),
-a-a-a L == [C,D].
?- Y = g(A,X,B), X = f(Y,C,D), term_singletons(X, L),
-a-a-a L == [A,B,C,D].
Non-Functional requirement:
?- member(N,[5,10,15]), time(singletons(N)), fail; true.
% Zeit 1 ms, GC 0 ms, Lips 4046000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1352000, Uhr 11.08.2025 01:36
% Zeit 3 ms, GC 0 ms, Lips 1355333, Uhr 11.08.2025 01:36
true.
Can your Prolog system do that?
P.S.: Benchmark was:
singletons(N) :-
-a-a-a hydra2(N,Y),
-a-a-a between(1,1000,_), term_singletons(Y,_), fail; true.
hydra2(0, _) :- !.
hydra2(N, s(X,X)) :-
-a-a-a M is N-1,
-a-a-a hydra2(M, X).
Bye