Deutsch   English   Français   Italiano  
<vh3u2h$5822$1@solani.org>

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

Path: ...!weretis.net!feeder8.news.weretis.net!reader5.news.weretis.net!news.solani.org!.POSTED!not-for-mail
From: Mild Shock <janburse@fastmail.fm>
Newsgroups: comp.lang.prolog
Subject: Re: How Prolog became an education nightmare (Was: 50 Years of Prolog
 Nonsense)
Date: Thu, 14 Nov 2024 05:24:49 +0100
Message-ID: <vh3u2h$5822$1@solani.org>
References: <db903ba2-8ccd-418e-bd18-a9eb381cd222n@googlegroups.com>
 <e5616850-37a8-46fd-b2a8-e3ca252b8a5an@googlegroups.com>
 <vgvsb7$3e31$1@solani.org> <vgvseq$3e31$2@solani.org>
 <vh3tel$57pk$1@solani.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 14 Nov 2024 04:24:49 -0000 (UTC)
Injection-Info: solani.org;
	logging-data="172098"; 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:mBPv1ez/eyXq3lWheFKZ8twI1PQ=
In-Reply-To: <vh3tel$57pk$1@solani.org>
X-User-ID: eJwNyMEBwCAMAsCVTCOYjqNg9h+hvechGdSaBCcaHXShmbh19mSO/7h86bTGOSG9vC3sdhQDZm2pH6W7xvsBay0Wkg==
Bytes: 5749
Lines: 149


So how will the computer science Professor help
himself, and nevertheless show some compiler
construction.

If he lowers the expectation, he will use the curly
braces, namely { .. }. This and the singleton list
are practically the only braket syntaxes available

in standard Prolog, that leave a term footprint. The
normal parenthesis don’t leave any abstract parse tree.
So this brave computer science Professor could go on:

ompile({X}) --> compile(X). %%% scoping omitted
compile((X;Y)) --> compile(X), compile(Y).
compile((V=E)) --> [load(E),store(V)].

And he would then succeed in demonstrating a toy compiler:

?- X = {
           x = 1;
           {
                y = 2
           }
        }, compile(X, L, []).
L = [load(1), store(x), load(2), store(y)].

But this is very poor. It doesn’t allow for DSLs that
use different braketing syntax. And the computer science
professor will switch to Isabelle/HOL, since switching

to Prolog DCG is too painful?

Mild Shock schrieb:
> 
> Lets cut through the thicket. There is no
> real world use case of a (fy 1 yf). Take again
> the Pascal “begin” “end” mixfix example.
> Typically we want to then go on and write
> 
> for example a compiler:
> 
> :- op(1100,fy,begin).
> :- op(1100,yf,end).
> 
> compile((begin X end)) --> compile(X). %%% scoping omitted
> compile((X;Y)) --> compile(X), compile(Y).
> compile((V=E)) --> [load(E),store(V)].
> 
> The problem is the pattern (begin X end) will
> not work, if multiple (begin … end) are involved
> in the compile/1 call. You can try yourself, no
> 
> Prolog system can do it:
> 
> /* SWI-Prolog */
> ?- X = (begin
>            x = 1;
>            begin
>                 y = 2
>            end
>         end), compile(X, L, []).
> false.
> %%% expected L = [load(1),store(x),load(2),store(y)]
> 
> /* SICStus Prolog */
> ?- X = (begin
>            x = 1;
>            begin
>                 y = 2
>            end
>         end), compile(X, L, []).
> no.
> %%% expected L = [load(1),store(x),load(2),store(y)]
> 
> The reason is that the parser will join multiple yf,
> similarly it would join multiple fy. The parser will
> not follow a braket pattern. At least I don’t know
> any Prolog system that can do it.
> 
> Mild Shock schrieb:
>> Here is the SWI-Prolog and the SICStus
>> Prolog abstract parse term. This is the real
>> nightmare of every computer science professor,
>>
>> who wants to use Prolog in a compiler
>> construction course:
>>
>> /* SWI-Prolog 9.3.14 */
>> end(end(begin(;(=(x,1),;(=(y,2),begin(=(z,3)))))))
>>
>> /* SICStus Prolog 4.9.0 */
>> begin(;(=(x,1),;(=(y,2),begin(end(end(=(z,3)))))))
>>
>> On the other hand mostlikely the OP @horsh
>> would expect:
>>
>> /* What the End-User wants */
>> end(begin(;(=(x,1),;(=(y,2),end(begin(=(z,3)))))))
>>
>> I think its impossible to do in any Prolog system,
>> you would need a programming language with the
>> possibility to do mixfix syntax definitions,
>>
>> like for example in Isabelle/HOL:
>>
>> (* Define the mixfix syntax for a Pascal-like block *)
>> syntax
>>    "_begin_end" :: "'a ⇒ 'a" ("begin _ end")
>>
>> Or otherwise use DCG to write your own parser
>> for the DSL at hand, that you want to parse.
>> Since Prolog operators cannot model mixfix syntax,
>>
>> at least SWI-Prolog and SICStus Prolog fail,
>> and I guess other Prolog systems fail as well.
>>
>> Mild Shock schrieb:
>>> Concerning the input (xxx yyy zzz) the OP wrote:
>>>
>>> I would expect it to print zzz(xxx(yyy)).
>>>
>>> Where did he get this requirement from, he didn’t
>>> compare other Prolog systems, right? So it came from
>>> his applicationdomain. But what was his application
>>>
>>> domain? Ok, lets proceed to an example with multiple
>>> brakets. Lets make the Pascal “begin” “end” example,
>>> by replacing xxx and zzz by “begin” and “end”.
>>>
>>> I get this result:
>>>
>>> ?- member(X,[begin,end]), current_op(Y,Z,X).
>>> X = (begin), Y = 1100, Z = fy ;
>>> X = (end), Y = 1100, Z = yf.
>>>
>>> ?- X = (begin
>>> |          x = 1;
>>> |          y = 2;
>>> |          begin
>>> |               z = 3
>>> |          end
>>> |       end).
>>> X = (begin x=1;y=2;begin z=3 end end).
>>>
>>> But is the abstract parse term, the Prolog result useful?
>>>
>>
>