Path: ...!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: DCG restrictions on the left-hand side [Novacore] Date: Wed, 31 Jul 2024 08:07:22 +0200 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Wed, 31 Jul 2024 06:07:21 -0000 (UTC) Injection-Info: solani.org; logging-data="631716"; 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.18.2 Cancel-Lock: sha1:RDqV0JZTUq/Njqd5NoL+eadySC4= X-User-ID: eJwVyskBwCAIBMCWOBcsR0T6L8HkPeMKxgmDw3x8+t4uREa7ThnTWmkadwv1p6ackJ5ROlJO+NsRg5AWce8HWlgVVg== In-Reply-To: Bytes: 2929 Lines: 76 I think its worth adopting this behaviour: /* Scryer Prolog */ ?- a-->b. error(existence_error(procedure,(-->)/2),(-->)/2). ?- assertz((a-->b)). error(permission_error(modify,static_procedure,(-->)/2),assertz/1). ?- a-->b. error(existence_error(procedure,(-->)/2),(-->)/2). Mild Shock schrieb: > Although SWI-Prolog implements a lot of checks. > It still allows this one: > > ?- a-->b. > ERROR: Unknown procedure: (-->)/2 > > ?- assertz((a-->b)). > true. > > ?- a-->b. > true. > > Scryer Prolog managed to prevent this, in that > the assertz/1 throws an error. > > Think will finally adopt this behaviour to > prevent the end-user from accidentially > > fiddling with (-->)/2. > > Mild Shock schrieb: >> >> This was discussed here: >> >> Definite Clause Grammars Harmonization Proposal >> Last edit jschimpf? October 20, 2016, at 12:42 AM >> https://eclipseclp.org/wiki/Prolog/DCG >> >> Not sure why Scryer Prolog doesn't implement it. >> >> Mild Shock schrieb: >>> >>> In Novacore we are lucky, its a side effect of >>> phrase translating the head and a multi-file check: >>> >>> ?- [user]. >>> p;q --> r. >>> Fehler: Kann Prädikat ;/2 nicht umdefinieren, nicht als Mehrdateien >>> markiert. >>> >>> But might work out differently if a DCG is expanded >>> and asserted. Ok, its actually not so bad: >>> >>> ?- expand_term((p;q --> r), X), assertz(X). >>> Fehler: Kann Prädikat ;/2 nicht aktualisieren. >>>      user auf 1 >>> >>> >>> Mild Shock schrieb: >>>> Guess how many newer Prolog systems allow this here: >>>> >>>> ?- [user]. >>>> p;q --> r. >>>>     true. >>>> >>>> On the other hand SWI-Prolog disallows it: >>>> >>>> ?- [user]. >>>> p;q --> r. >>>> >>>> ERROR: user://1:29: >>>> ERROR:    No permission to define dcg_nonterminal `p;q' >>> >> >