RAAN@TECHUNIX.BITNET (03/01/85)
From: raan@techunix.bitnet (Ran Ever-Hadani) <Do you line eaters really exist?> Given is the following goal: assert(a),a,once_detract(a),assert(a),fail. (*once_detract* is a detract that succeeds only once) Assuming an initially empty data base, the first *assert* will add the clause *a.* to the data base, the *a* will succeed, the *detract* will delete it, the second *assert* will add a new one, the second attempt to *once_detract* will fail, and finally control would try to match another *a.*. At this point there are two possibilities: 1) Since a new *a.* has been asserted, it would succeed. 2) After the first time *a* succeeds, it would be marked somewhere that there are no more *a*'s and even though another one was added in the meanwhile, the second attempt will fail. There are arguments for defining it either way. Unfortunately, C-Prolog 1.4a takes the first alternative with debug on, and the second with debug off, which caused me a hell of a headache trying to figure out why my program does not behave the same with debug on and off. The solution that worked for me was to replace every such *a,* in my program with *clause(a,true),* which takes the first way with debug on and off. If someone out there knows who maintains C-Prolog, I will appreciate it if he passes my letter on. Ran Ever-Hadani Technion, Haifa, Israel Bitnet: raan@techunix