I've been following this thread pretty much since the beginning. I hope I didn't miss anything subtle. You'll let me know if I have, I'm sure. ;=)

It appears the need for temporal dependencies or different levels of reasoning has been conflated with the terms "forward-chaining" (FWC) and "backward-chaining" (BWC), which are typically used to describe different rule base evaluation algorithms used by expert systems.

The terms “forward-chaining” and “backward-chaining” when used to refer to reasoning strategies have absolutely nothing to do with temporal dependencies or levels of reasoning. These two terms refer simply, and only, to the algorithms used to evaluate “if/then” rules in a rule base (RB). In the FWC algorithm, the “if” part is evaluated and, if TRUE, the “then” part is added to the FWC engine's output. In the BWC algorithm, the “then” part is evaluated and, if TRUE, the “if” part is added to the BWC engine's output. It is rare, but some systems use both FWC and BWC.

That's it.  Period.  No other denotations or connotations apply.

To help remove any mystery that may still surround these concepts, here is an FWC algorithm in pseudo-code (WARNING: I'm glossing over quite a few details here – I'll be happy to answer questions on list or off):

   0. set loop index to 0
   1. got next rule?
         no: goto 5
   2. is rule FIRED?
         yes: goto 1
   3. is key equal to rule's antecedent?
         yes: add consequent to output, mark rule as FIRED,
              output is new key, goto 0
   4. goto 1
   5. more input data?
         yes: input data is new key, goto 0
   6. done.

To turn this into a BWC algorithm, we need only modify Step #3 to read as 
follows:

   3. is key equal to rule's consequent?
         yes: add antecedent to output, mark rule as FIRED,
         output is new key, goto 0

If you need to represent temporal dependencies in FWC/BWC systems, you have to express them using rules. For example, if washer-a MUST be placed on bolt-b before nut-c can be screwed on, the rule base might look something like this:

   1. if installed(washer-x) then install(nut-z)
   2. if installed(bolt-y) then install(washer-x)
   3. if notInstalled(bolt-y) then install(bolt-y)

In this case, rule #1 won't get fired until rule #2 fires (nut-z can't get installed until washer-x has been installed). Rule #2 won't get fired until rule #3 has fired (washer-x can't get installed until bolt-y has been installed). NUT-Z! (Sorry, couldn't help it.)

To kick things off, we pass in “bolt-y” as the initial key. This triggers rule #3, which will trigger rule #2, which will trigger rule #1. These temporal dependencies result in the following assembly sequence: install bolt-y, then install washer-x, and, finally, install nut-z.

A similar thing can be done to implement rule hierarchies.

   1. if levelIs(0) and installed(washer-x) then install(nut-z)
   2. if levelIs(0) and installed(nut-z) goLevel(1)
   3. if levelIs(1) and notInstalled(gadget-xx) then install(gadget-xx)
   4. if levelIs(0) and installed(bolt-y) then install(washer-x)
   5. if levelIs(0) and notInstalled(bolt-y) then install(bolt-y)

Here rule #2 won't fire until rule #1 has fired. Rule #1 won't fire unless rule #4 has fired. Rule #4 won't fire until rule #5 has fired. And, finally, Rule #3 won't fire until Rule #2 has fired. So, level 0 could represent the reasoning required before level 1 rules (rule #3 here) will be of any use. (That's not the case here, of course, just stretching my humble example as far as I can.)

Note, again, that the temporal and level references in the rules are NOT used by the BWC. They probably will be used by the part of the program that does something with the BWC's output (the install(), goLevel(), etc. functions). And, again, the results should be completely unaffected by the order in which the RB rules are evaluated or fired.

I hope this helps.

Cheers,

Brad

Richard Loosemore wrote:
Mike Tintner wrote:
A tangential comment here. Looking at this and other related threads I can't help thinking: jeez, here are you guys still endlessly arguing about the simplest of syllogisms, seemingly unable to progress beyond them. (Don't you ever have that feeling?) My impression is that the fault lies with logic itself - as soon as you start to apply logic to the real world, even only tangentially with talk of "forward" and "backward" or "temporal" considerations, you fall into a quagmire of ambiguity, and no one is really sure what they are talking about. Even the simplest if p then q logical proposition is actually infinitely ambiguous. No? (Is there a Godel's Theorem of logic?)

Well, now you have me in a cleft stick, methinks.

I *hate* logic as a way to understand cognition, because I think it is a derivative process within a high-functional AGI system, not a foundation process that sits underneath everything else.

But, on the other hand, I do understand how it works, and it seems a shame for someone to trample on the concept of forward and backward chaining when these are really quite clear and simple processes (at least conceptually).

You are right that logic is as clear as mud outside the pristine conceptual palace within which it was conceived, but if you're gonna hang out inside the palace it is a bit of a shame to question its elegance...



Richard Loosemore



-------------------------------------------
agi
Archives: https://www.listbox.com/member/archive/303/=now
RSS Feed: https://www.listbox.com/member/archive/rss/303/
Modify Your Subscription: https://www.listbox.com/member/?&;
Powered by Listbox: http://www.listbox.com



-------------------------------------------
agi
Archives: https://www.listbox.com/member/archive/303/=now
RSS Feed: https://www.listbox.com/member/archive/rss/303/
Modify Your Subscription: 
https://www.listbox.com/member/?member_id=8660244&id_secret=108809214-a0d121
Powered by Listbox: http://www.listbox.com

Reply via email to