🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.prolog
Article #3537

The "double cut"

#3537
From: Francois-Michel Lang
Date: Tue, 02 Aug 1988 15:19
70 lines
3084 bytes
In article <208500002@s.cs.uiuc.edu> gooley@s.cs.uiuc.edu writes:
>Some debuggers on some systems (C-Prolog is one, I think) show apparent
>retries of deterministic system calls.  Might this be misleading people
>into thinking that cuts are needed to prevent such retries in actual
>execution?

This could also be a "problem" for when debuggers show apparent
retries of deterministic user-defined predicates.

If your Prolog does indexing on the functor/arity
of the first argument of predicates,
the standard definition of append/3, namely

append([], L, L).
append([H|T], List, [H|Rest]) :- 
	append(T, List, Rest).

is quite deterministic.
However, if you single step through something like

| ?- trace, append([a,b,c], [1,2,3], List), fail.

depending on your debugger, you'll probably see lots of "redo"s
which you might think that a cut would have prevented.
E.g.,

| ?- trace, append([a,b,c], [1,2,3], List), fail.
[The debugger will first creep -- showing everything (trace)]
   (3) 0 Call: append([a,b,c],[1,2,3],_978) ? 
   (4) 1 Call: append([b,c],[1,2,3],_1205) ? 
   (5) 2 Call: append([c],[1,2,3],_1238) ? 
   (6) 3 Call: append([],[1,2,3],_1271) ? 
   (6) 3 Exit: append([],[1,2,3],[1,2,3]) ? 
   (5) 2 Exit: append([c],[1,2,3],[c,1,2,3]) ? 
   (4) 1 Exit: append([b,c],[1,2,3],[b,c,1,2,3]) ? 
   (3) 0 Exit: append([a,b,c],[1,2,3],[a,b,c,1,2,3]) ? 
   (3) 0 Redo: append([a,b,c],[1,2,3],[a,b,c,1,2,3]) ? 
   (4) 1 Redo: append([b,c],[1,2,3],[b,c,1,2,3]) ? 
   (5) 2 Redo: append([c],[1,2,3],[c,1,2,3]) ? 
   (6) 3 Redo: append([],[1,2,3],[1,2,3]) ? 
   (6) 3 Fail: append([],[1,2,3],_1271) ? 
   (5) 2 Fail: append([c],[1,2,3],_1238) ? 
   (4) 1 Fail: append([b,c],[1,2,3],_1205) ? 
   (3) 0 Fail: append([a,b,c],[1,2,3],_978) ? 

no
| ?- 

*** VERSUS ***

| ?- trace, append([a,b,c], [1,2,3], List), !, fail.
[The debugger will first creep -- showing everything (trace)]
   (3) 0 Call: append([a,b,c],[1,2,3],_137) ? 
   (4) 1 Call: append([b,c],[1,2,3],_377) ? 
   (5) 2 Call: append([c],[1,2,3],_410) ? 
   (6) 3 Call: append([],[1,2,3],_443) ? 
   (6) 3 Exit: append([],[1,2,3],[1,2,3]) ? 
   (5) 2 Exit: append([c],[1,2,3],[c,1,2,3]) ? 
   (4) 1 Exit: append([b,c],[1,2,3],[b,c,1,2,3]) ? 
   (3) 0 Exit: append([a,b,c],[1,2,3],[a,b,c,1,2,3]) ? 

no
| ?- 

In the second example, it looks like the cut has saved some work,
whereas it really hasn't.
----------------------------------------------------------------------------
Francois-Michel Lang
Paoli Research Center, Unisys Corporation lang@prc.unisys.com (215) 648-7256
Dept of Comp & Info Science, U of PA      lang@cis.upenn.edu  (215) 898-9511
Technical Details
Message-ID: <7146@burdvax.PRC.Unisys.COM>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!attcan!uunet!lll-winken!lll-tis!helios.ee.lbl.gov!nosc!ucsd!rutgers!gatech!udel!burdvax!zeta!lang

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!attcan!uunet!lll-winken!lll-tis!helios.ee.lbl.gov!nosc!ucsd!rutgers!gatech!udel!burdvax!zeta!lang
From: lang@zeta.PRC.Unisys.COM (Francois-Michel Lang)
Newsgroups: comp.lang.prolog
Subject: The "double cut"
Keywords: cut determinism debugging backtracking
Message-ID: <7146@burdvax.PRC.Unisys.COM>
Date: 2 Aug 88 15:19:57 GMT
Sender: news@PRC.Unisys.COM
Lines: 69