Deutsch   English   Français   Italiano  
<105ae0d$2dlfh$2@solani.org>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: nntp.eternal-september.org!news.eternal-september.org!eternal-september.org!feeder3.eternal-september.org!weretis.net!feeder8.news.weretis.net!reader5.news.weretis.net!news.solani.org!.POSTED!not-for-mail
From: Mild Shock <janburse@fastmail.fm>
Newsgroups: sci.logic
Subject: =?UTF-8?Q?So_we_are_essentially_all_using_Trojan_Horses_?=
 =?UTF-8?B?8J+QjiBkYWlseT8gKFJlOiBGaXNoeSDwn5CfIGluIFNjcnllciBQcm9sb2cgYW5k?=
 =?UTF-8?Q?_SWI-Prolog=29?=
Date: Thu, 17 Jul 2025 10:58:55 +0200
Message-ID: <105ae0d$2dlfh$2@solani.org>
References: <1058lt5$2cep9$2@solani.org> <1058luf$2cep9$3@solani.org>
 <1058lvi$2cep9$4@solani.org> <105adhh$2dl43$1@solani.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 17 Jul 2025 08:58:53 -0000 (UTC)
Injection-Info: solani.org;
	logging-data="2545137"; mail-complaints-to="abuse@news.solani.org"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101
 Firefox/128.0 SeaMonkey/2.53.21
Cancel-Lock: sha1:8S08LLfyEWO999iiBYFXPunrNik=
In-Reply-To: <105adhh$2dl43$1@solani.org>
X-User-ID: eJwNycEBwCAIA8CVBEOQcQRk/xHa+55tCstBI2xsMq0T6jqhc0S8QMl3Nw+U//Vqt4lCzOh0wCDQvrVOPeIDVk0VnQ==

You can answer such questions
to the negative via Fuzzy Testing:

 > However such relation induced above is transitive ?

Typical counter example, showing
the native compare/3 is not transitive:

/* SWI-Prolog 9.3.25 */
?- repeat, fuzzy(X), fuzzy(Y), compare(<,X,Y), fuzzy(Z),
     compare(<,Y,Z),  compare(>,X,Z).
X = f(f(f(X, 1), 1), 1),
Y = f(f(Y, 1), 0),
Z = f(f(f(Z, 1), 0), 1) .
Etc..

Works also for Trealla Prolog, so I
assume compare_expensive/3 also fails:

/* Trealla Prolog 2.78.5 */
?- repeat, fuzzy(X), fuzzy(Y), compare(<,X,Y), fuzzy(Z),
     compare(<,Y,Z),  compare(>,X,Z).
    X = f(f(f(...,0),0),1), Y = f(f(...,1),0), Z = f(f(...,0),1)
;  ... .
Etc..

In essence, my nasty fuzzer uses
variants of Matt Carlsons example.

P.S.: From a logic viewpoint you could view
Fuzzy Testing as a form of randomized model
checking. A little famous Fuzzy Tester was Sandsifter:

"The tool discovered undocumented instructions
in all major processors, shared bugs in nearly
every major assembler and disassembler, flaws in
enterprise hypervisors, and critical x86 hardware"
https://github.com/xoreaxeaxeax/sandsifter/blob/master/references/domas_breaking_the_x86_isa_wp.pdf

So we are essentially all using Trojan Horses 🐎 daily?

Mild Shock schrieb:
> Hi,
> 
> The same example values also create fishy 🐟
> sorting using native sorting in Scryer Prolog:
> 
> /* Scryer Prolog 0.9.4-417 */
> ?- values([z,x,y], A), sort(A, B),
>     values([x,y,z], C), sort(C, D), B == D.
>     false. /* fishy 🐟 */
> 
> Or using native sorting in SWI-Prolog:
> 
> /* SWI-Prolog 9.3.25 */
> ?- values([z,x,y], A), sort(A, B),
>     values([x,y,z], C), sort(C, D), B == D.
> false. /* fishy 🐟 */
> 
> Bye
> 
> Mild Shock schrieb:
>>
>>  > I checked that your examples are not counter
>>  > examples for my compare_with_stack/3.
>>
>> What makes you think the values I show, X, Y
>> and Z, are possible in a total linear ordering?
>> The values also break predsort/3, you can easily
>> verify that sort([x,y,z]) =\= sort([y,x,z]):
>>
>> value(x, X) :- X = X-0-9-7-6-5-4-3-2-1.
>> value(y, Y) :- Y = Y-7-5-8-2-4-1.
>> value(z, Z) :- H = H-9-7-6-5-4-3-2-1-0, Z = H-9-7-6-5-4-3-2-1.
>>
>> values(L, R) :- maplist(value, L, R).
>>
>> ?- values([x,y,z], A), predsort(compare_with_stack, A, B),
>>     values([y,x,z], C), predsort(compare_with_stack, C, D),
>>     B == D.
>> false.
>>
>> But expectation would be sort([x,y,z]) ==
>> sort([y,x,z]) since sort/2 should be immune
>> to permutation. If this isn’t enough proof that
>> there is something fishy in compare_with_stack/3 ,
>>
>> well then I don’t know, maybe the earth is indeed flat?
>>
>> Mild Shock schrieb:
>>> Hi,
>>>
>>> Now somebody was so friendly to spear head
>>> a new Don Quixote attempt in fighting the
>>> windmills of compare/3. Interestingly my
>>>
>>> favorite counter example still goes through:
>>>
>>> ?- X = X-0-9-7-6-5-4-3-2-1, Y = Y-7-5-8-2-4-1,
>>>     compare_with_stack(C, X, Y).
>>> X = X-0-9-7-6-5-4-3-2-1,
>>> Y = Y-7-5-8-2-4-1,
>>> C = (<).
>>>
>>> ?- H = H-9-7-6-5-4-3-2-1-0, Z = H-9-7-6-5-4-3-2-1, Y = Y-7-5-8-2-4-1,
>>>     compare_with_stack(C, Z, Y).
>>> H = H-9-7-6-5-4-3-2-1-0,
>>> Z = H-9-7-6-5-4-3-2-1,
>>> Y = Y-7-5-8-2-4-1,
>>> C = (>).
>>>
>>> ?- H = H-9-7-6-5-4-3-2-1-0, Z = H-9-7-6-5-4-3-2-1, X = 
>>> X-0-9-7-6-5-4-3-2-1,
>>>     compare_with_stack(C, Z, X).
>>> H = H-9-7-6-5-4-3-2-1-0,
>>> Z = X, X = X-0-9-7-6-5-4-3-2-1,
>>> C = (=).
>>>
>>> I posted it here in March 2023:
>>>
>>> Careful with compare/3 and Brent algorithm
>>> https://swi-prolog.discourse.group/t/careful-with-compare-3-and-brent-algorithm/6413 
>>>
>>>
>>> Its based that rational terms are indeed in
>>> some relation to rational numbers. The above
>>> terms are related to:
>>>
>>> 10/81 = 0.(123456790) = 0.12345679(012345679)
>>>
>>> Bye
>>>
>>> Mild Shock schrieb:
>>>> Hi,
>>>>
>>>> That false/0 and not fail/0 is now all over the place,
>>>> I don't mean in person but for example here:
>>>>
>>>> ?- X=f(f(X), X), Y=f(Y, f(Y)), X = Y.
>>>> false.
>>>>
>>>> Is a little didactical nightmare.
>>>>
>>>> Syntactic unification has mathematical axioms (1978),
>>>> to fully formalize unifcation you would need to
>>>> formalize both (=)/2 and (≠)/2 (sic!), otherwise you
>>>> rely on some negation as failure concept.
>>>>
>>>> Keith L. Clark, Negation as Failure
>>>> https://link.springer.com/chapter/10.1007/978-1-4684-3384-5_11
>>>>
>>>> You can realize a subset of a mixture of (=)/2
>>>> and (≠)/2 in the form of a vanilla unify Prolog
>>>> predicate using some of the meta programming
>>>> facilities of Prolog, like var/1 and having some
>>>>
>>>> negation as failure reading:
>>>>
>>>> /* Vanilla Unify */
>>>> unify(V, W) :- var(V), var(W), !, (V \== W -> V = W; true).
>>>> unify(V, T) :- var(V), !, V = T.
>>>> unify(S, W) :- var(W), !, W = S.
>>>> unify(S, T) :- functor(S, F, N), functor(T, F, N),
>>>>       S =.. [F|L], T =.. [F|R], maplist(unify, L, R).
>>>>
>>>> I indeed get:
>>>>
>>>> ?- X=f(f(X), X), Y=f(Y, f(Y)), unify(X,Y).
>>>> false.
>>>>
>>>> If the vanilla unify/2 already fails then unify
>>>> with and without subject to occurs check, will also
>>>> fail, and unify with and without ability to
>>>> handle rational terms, will also fail:
>>>>
>>>> Bye
>>>
>>
========== REMAINDER OF ARTICLE TRUNCATED ==========