home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   sci.logic      Logic -- math, philosophy & computationa      262,912 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 261,839 of 262,912   
   olcott to Mikko   
   Re: A new foundation for correct reasoni   
   12 Dec 25 08:19:10   
   
   XPost: comp.theory, sci.math, comp.lang.prolog   
   From: polcott333@gmail.com   
      
   On 12/12/2025 2:50 AM, Mikko wrote:   
   > olcott kirjoitti 11.12.2025 klo 16.17:   
   >> On 12/11/2025 2:42 AM, Mikko wrote:   
   >>> olcott kirjoitti 10.12.2025 klo 16.10:   
   >>>> On 12/10/2025 4:04 AM, Mikko wrote:   
   >>>>> olcott kirjoitti 8.12.2025 klo 21.09:   
   >>>>>> On 12/8/2025 3:13 AM, Mikko wrote:   
   >>>>>>> olcott kirjoitti 5.12.2025 klo 19.43:   
   >>>>>>>> On 12/5/2025 3:38 AM, Mikko wrote:   
   >>>>>>>>> olcott kirjoitti 4.12.2025 klo 16.06:   
   >>>>>>>>>> On 12/4/2025 2:58 AM, Mikko wrote:   
   >>>>>>>>>>> Tristan Wibberley kirjoitti 4.12.2025 klo 4.32:   
   >>>>>>>>>>>> On 30/11/2025 09:58, Mikko wrote:   
   >>>>>>>>>>>>   
   >>>>>>>>>>>>> Note that the meanings of   
   >>>>>>>>>>>>>   ?- G = not(provable(F, G)).   
   >>>>>>>>>>>>> and   
   >>>>>>>>>>>>>   ?- unify_with_occurs_check(G, not(provable(F, G))).   
   >>>>>>>>>>>>> are different. The former assigns a value to G, the latter   
   >>>>>>>>>>>>> does not.   
   >>>>>>>>>>>   
   >>>>>>>>>>>> For sufficiently informal definitions of "value".   
   >>>>>>>>>>>> And for sufficiently wrong ones too!   
   >>>>>>>>>>>   
   >>>>>>>>>>> It is sufficiently clear what "value" of a Prolog variable   
   >>>>>>>>>>> means.   
   >>>>>>>>>   
   >>>>>>>>>> % This sentence cannot be proven in F   
   >>>>>>>>>> ?- G = not(provable(F, G)).   
   >>>>>>>>>> G = not(provable(F, G)).   
   >>>>>>>>>> ?- unify_with_occurs_check(G, not(provable(F, G))).   
   >>>>>>>>>> false.   
   >>>>>>>>>>   
   >>>>>>>>>> I would say that the above Prolog is the 100%   
   >>>>>>>>>> complete formal specification of:   
   >>>>>>>>>>   
   >>>>>>>>>> "This sentence cannot be proven in F"   
   >>>>>>>>>   
   >>>>>>>>> The first query can be regarded as a question whether "G =   
   >>>>>>>>> not(provable(   
   >>>>>>>>> F, G))" can be proven for some F and some G. The answer is that   
   >>>>>>>>> it can   
   >>>>>>>>> for every F and for (at least) one G, which is not(provable(G)).   
   >>>>>>>>>   
   >>>>>>>>> The second query can be regarded as a question whether "G =   
   >>>>>>>>> not(provable   
   >>>>>>>>> (F, G))" can be proven for some F and some G that do not   
   >>>>>>>>> contain cycles.   
   >>>>>>>>> The answer is that in the proof system of Prolog it cannot be.   
   >>>>>>>>   
   >>>>>>>> No that it flatly incorrect. The second question is this:   
   >>>>>>>> Is "G = not(provable(F, G))." semantically sound?   
   >>>>>>>   
   >>>>>>> Where is the definition of Prolog semantics is that said?   
   >>>>>>   
   >>>>>> Any expression of Prolog that cannot be evaluated to   
   >>>>>> a truth value because it specifies non-terminating   
   >>>>>> infinite recursion is "semantically unsound" by the   
   >>>>>> definition of those terms even if Prolog only specifies   
   >>>>>> that cannot be evaluated to a truth value because it   
   >>>>>> specifies non-terminating infinite recursion.   
   >>>>>   
   >>>>> Your Prolog implementation has evaluated G = not(provablel(F, G))   
   >>>>> to a truth value true. When doing so it evaluated each side of =   
   >>>>> to a value that is not a truth value.   
   >>>>   
   >>>> ?- unify_with_occurs_check(G, not(provable(F, G))).   
   >>>> false.   
   >>>>   
   >>>> Proves that   
   >>>> G = not(provable(F, G)).   
   >>>> would remain stuck in infinite recursion.   
   >>>>   
   >>>> unify_with_occurs_check() examines the directed   
   >>>> graph of the evaluation sequence of an expression.   
   >>>> When it detects a cycle that indicates that an   
   >>>> expression would remain stuck in recursive   
   >>>> evaluation never to be resolved to a truth value.   
   >>>>   
   >>>> BEGIN:(Clocksin & Mellish 2003:254)   
   >>>> Finally, a note about how Prolog matching sometimes differs   
   >>>> from the unification used in Resolution. Most Prolog systems   
   >>>> will allow you to satisfy goals like:   
   >>>>   
   >>>> equal(X, X).   
   >>>> ?- equal(foo(Y), Y).   
   >>>>   
   >>>> that is, they will allow you to match a term against an   
   >>>> uninstantiated subterm of itself. In this example, foo(Y)   
   >>>> is matched against Y, which appears within it. As a result,   
   >>>> Y will stand for foo(Y), which is foo(foo(Y)) (because of   
   >>>> what Y stands for), which is foo(foo(foo(Y))), and so on.   
   >>>> So Y ends up standing for some kind of infinite structure.   
   >>>>   
   >>>> Note that, whereas they may allow you to construct something   
   >>>> like this, most Prolog systems will not be able to write it   
   >>>> out at the end. According to the formal definition of   
   >>>> Unification, this kind of “infinite term” should never come   
   >>>> to exist. Thus Prolog systems that allow a term to match an   
   >>>> uninstantiated subterm of itself do not act correctly as   
   >>>> Resolution theorem provers. In order to make them do so, we   
   >>>> would have to add a check that a variable cannot be   
   >>>> instantiated to something containing itself. Such a check,   
   >>>> an occurs check, would be straightforward to implement, but   
   >>>> would slow down the execution of Prolog programs considerably.   
   >>>> Since it would only affect very few programs, most implementors   
   >>>> have simply left it out 1.   
   >>>>   
   >>>> 1 The Prolog standard states that the result is undefined if   
   >>>> a Prolog system attempts to match a term against an uninstantiated   
   >>>> subterm of itself, which means that programs which cause this to   
   >>>> happen will not be portable. A portable program should ensure that   
   >>>> wherever an occurs check might be applicable the built-in predicate   
   >>>> unify_with_occurs_check/2 is used explicitly instead of the normal   
   >>>> unification operation of the Prolog implementation. As its name   
   >>>> suggests, this predicate acts like =/2 except that it fails if an   
   >>>> occurs check detects an illegal attempt to instantiate a variable.   
   >>>> END:(Clocksin & Mellish 2003:254)   
   >>>>   
   >>>> Clocksin, W.F. and Mellish, C.S. 2003. Programming in Prolog   
   >>>> Using the ISO Standard Fifth Edition, 254. Berlin Heidelberg:   
   >>>> Springer-Verlag.   
   >>>   
   >>> Thank you for the confirmation of my explanation of your error.   
   >>   
   >>  >> Y will stand for foo(Y), which is foo(foo(Y)) (because of   
   >>  >> what Y stands for), which is foo(foo(foo(Y))), and so on.   
   >> As I say non-terminating, thus never resolves to a truth value.   
   >   
   > As according to Prolog rules foo(Y) isn't a truth value for any Y   
   > the above is obviously just an attempt to deive with a distraction.   
   >   
      
   That was a quote from the most definitive source   
   for the Prolog Language.   
      
   Prolog only has Facts and Rules thus the only   
   derivation is to a truth value.   
      
   --   
   Copyright 2025 Olcott

              My 28 year goal has been to make
       "true on the basis of meaning expressed in language"
       reliably computable.

              This required establishing a new foundation
              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca