Path: ...!news.roellig-ltd.de!open-news-network.org!weretis.net!feeder8.news.weretis.net!reader5.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Mild Shock Newsgroups: comp.lang.prolog Subject: Re: Side Note, Why not DSLs? (Re: Chicken and egg, with curry?) Date: Fri, 3 Jan 2025 22:12:14 +0100 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Fri, 3 Jan 2025 21:12:14 -0000 (UTC) Injection-Info: solani.org; logging-data="2290299"; mail-complaints-to="abuse@news.solani.org" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0 SeaMonkey/2.53.19 Cancel-Lock: sha1:ar6Dram/X+6pakYC9jDGqhvdh6k= In-Reply-To: X-User-ID: eJwFwYEBwDAEBMCVPJ5knKD2H6F3tEB0ejCcy9Vr5S1wHzxTu1JZiTm2iLmR2uf1V6Vkac8MnFRInxQOfzqFFOo= Bytes: 6127 Lines: 156 Ok I see its repeating my posts to comp.lang.prolog, because the sci.logic post has a shitty header! Fuck Fuck Fuck Julio what are you doing Fuck Fuck Fuck Mild Shock schrieb: > Hi, > > Just a side note, don't let you get distracted. > A side node about the chicken/egg problem, i.e. > without the curry: > > - a) Eggs came first, for example Turtles had eggs >      Turtles are part of an ancient reptilian >      lineage ca 300 million years ago > > - b) Chickens came after Turtles >      Chickens, on the other hand, are much younger >      in comparison, evolved from theropod dinosaurs >      around 150 million years ago > > Not sure whether this helps. But I think it could help > nevertheless: > > - i) Logic Programming is the Egg > > - ii) From the Egg Turtles or Chickens can hatch, >     its very easy to program functionally or >     procdurally in Prolog. Just add small DSLs: > > https://en.wikipedia.org/wiki/Domain-specific_language > > here is an example of a DSL for array manipulation, > and an implementation of Floyd Warshall algorithm: > > :- op(100, yf, []). > :- op(800, fx, new). > :- op(800, fx, let). > :- op(800, fx, if). > > warshall(N, D) :- >    new D[N,N], >    (between(1,N,U), between(1,N,V), let D[U,V] = 999, fail; true), >    (edge(U,V,W), let D[U,V] = W, fail; true), >    (vertex(V), let D[V,V] = 0, fail; true), >    (between(1,N,K), >        between(1,N,I), >           between(1,N,J), >               let H = D[I,K] + D[K,J], >               (if D[I,J] > H -> let D[I,J] = H; true), >               fail; true). > > The definition of the DSL needs only one extension > of Prolog, i.e. nb_setarg/3 (SWI-Prolog) respectively > change_arg/3 (Dogelog Player): > > new D[N,M] :- >    functor(D, '', N), >    D =.. [_|L], >    new2(L, M). > > new2([], _). > new2([X|L], N) :- >    functor(X, '', N), >    new2(L, N). > > let V = E :- var(V), !, >    let2(E,V). > let D[R,C] = E :- >    let2(E,V), >    arg(R, D, H), >    nb_setarg(C, H, V). > > let2(D[R,C], V) :- !, >    arg(R, D, H), >    arg(C, H, V). > let2(E+F, R) :- !, >    let2(E, V), >    let2(F, W), >    R is V+W. > let2(V, V). > > if E > F :- >    let2(E, V), >    let2(F, W), >    V > W. > > Idiot Prolog systems like Scryer Prolog or Trealla Prolog > refuse to provide such imperative gadgets, which are quite > useful. If you interpret the DSL, its already bleeing fast, > > much faster than a pure implementation: > > ?- time((between(1,1000,_), graph(G), >    floyd_warshall(4, G, M), fail; true)). > % 3,803,998 inferences, 0.156 CPU in 0.183 seconds (85% CPU, 24345587 Lips) > true. > > ?- time((between(1,1000,_), warshall(4,D), fail; true)). > % 1,046,998 inferences, 0.062 CPU in 0.062 seconds (100% CPU, 16751968 > Lips) > true. > > If you compile the DSL, you can again an itch more speed: > > /* DSL compiled */ > ?- time((between(1,1000,_), warshall(4,D), fail; true)). > % 336,998 inferences, 0.000 CPU in 0.020 seconds (0% CPU, Infinite Lips) > true. > > Bye > > Julio Di Egidio schrieb: >> On 03/01/2025 21:04, Julio Di Egidio wrote: >>> Partial and tentative: >>> >>> ``` >>>    Functional = Closures/applications, Reduction/canonicity >>>      /    | >>> Logical  |   = Predicates/queries, Resolution/subsumption >>>      \    | >>>    Imperative = Procedures/invocations, Execution/... >>> ``` >>> >>> And there are two views of that triangle: Logical is the top of the >>> *ideal* such triangle, along the lines of a universe with Prop on >>> top, which we can reason with; Imperative is the bottom of a >>> *concrete* such triangle, the bootstrap as well as the final point of >>> application of any concrete system. >>> >>> And Logical is the constructive (structural) type-theory founding the >>> Functional, where Functional exists for expressivity and modularity >>> (what else?), plus can be compiled back/down to machine language... >>> >>> Right? >> >> BTW, there are deficiencies of standard Prolog that are indeed very >> annoying, to the point that some invoke for the other way round: >> >> HANSEI / Re-thinking Prolog >> >> >> But, besides that I would not put logic in terms of "guessing", I'd >> propose we just need a Prolog that doesn't have the self-inflicted >> quirks: a strengthened resolution with declarative determinism and >> indexing, and a strengthened semantics, of variables and/vs open >> terms, with a partial order of terms by subsumption, and unifiability >> as comparability (a purely structural type system definitionally), >> i.e. where a variable is the most general term...  Or something like >> that. >> >> No? >> >> -Julio >> >