Project Progress

By: 
Kort E Patterson

My company - and therefore major aspects of my personal life - have been going through a "digital change of life". After extensive testing in parallel with the "old" system, the moment finally arrived!

I shut down my last OS/2 machine on October 1st, and shifted the "official system supervisor" at the core of my business over to the new system running as a combination of native Linux desktop applications and server processes. And since I've been spending most of my professional time working with Linux, I've shifted the bulk of my personal "digital activities" over to Linux as well. I've been particularly intrigued by the potential for cooperative interactions among distributed processes running on networked Linux machines.

The converging needs to port Overall's "back-office" software to a new platform, and to find a "next step" development project to use in exploring ways of linking a prolog logic engine to the native functions and services of the Linux operating system, made rewriting the system supervisor into a unique kind of hybrid interactive application/server/multi-process dispatcher, seem like a reasonable undertaking in those early days of unimaginable naivety so long ago...

My language of choice is PDC Prolog, but I also use C/C++ and Pascal. Compiling the accounting software written in Pascal to run as a native Linux process only required a few hours of adjustments to the old DOS source code. This encouraging initial success turned out to be a less than accurate indication of the difficulties of porting the software I'd written in Prolog.

PDC has a Linux command line compiler that supports the core prolog logic predicates, but doesn't have much built in support for user interface or IO functions. On the other hand, most of Linux is written in C, and I've used C libraries and object code in Prolog programs before. The manuals referred to the Internet sockets I'd already worked with in windoze as "emulating BSD sockets" - and Linux uses real BSD sockets. It seemed like all the critical components were almost there - it would just take a little adjusting to fit them together...

I should know by now that nothing ever turns out to be as easy as it first appears.

Once again, it took a fair amount of flailing around before I'd accidentally learned enough about what I was trying to do, to realize that I was once again doggedly struggling to make things even more difficult than necessary. After a couple of false starts, things started to work well enough to convince me the objective was possible. But the devil is in the details, and getting them right is invariably the most time consuming and frustrating aspect of the development process. And there's no shortage of details in Linux.

I've spent the better part of a year, off and on, figuring out how to give my Linux/prolog programs the ability to interact with people and other computers. The first stage was creating a single purpose server that could interact on demand with other machines over a network using bursts of compressed encrypted binaries. The second stage added the ability to project a user interface over Internet sockets using "on-the-fly" generated HTML code. The third stage added the ability to autonomously contact and interactively exchange information with other processes using dial-up phone lines/modems or Internet socket connections, as well as the ability to manipulate external processes to create and/or obtain information required by the core process.

Of course, none of these "new breakthroughs" are actually new - most of them are available in other languages and/or on other platforms. I just appear to be the first to want to link together this particular combination of languages and operating system functions. And so, this time I'm obliged to blaze a bit of the trail instead of enjoying the luxury of following along in someone else's footsteps, as I've been able to do in most other projects.

I see a lot of interesting potential in a core logic engine with the adaptive flexibility possible within the goal driven logical anarchism of a declarative Prolog program, but also able to employ the speed, structure and control of procedural languages like C, Pascal, Perl, and shell scripts when appropriate, supported by a robust high performance multitasking network operating system, and possessing the capability of dynamically establishing sub-networks of cooperative associations with other processes running on the same computer, or on hardware that just happens to be physically located on the other side of the world. And so I continue to grope my way through the wilderness.

I've previously theorized that complex multilayered systems, composed of self-organizing autonomous digital neurons capable of modifying themselves and their neighbors through learned intent - and to a limited degree by chance trial and error - could, through goal driven adaptive evolution, leverage the relatively simplistic intelligence and motivations of individual digital neurons into a collective intelligence with sufficient depth and complexity to achieve self-awareness.

The current combination of capabilities make it possible to build a system composed of multiple distributed parallel processes that dynamically alter their own behavior - and that of other participating processes - through an interactive exchange of information. The next stage in my Linux/Prolog project will collect, within a single application, many of the basic capabilities needed by a digital neuron. I suspect development of a suitable core logic engine for a digital neuron is currently some distance short of even figuring out where the starting point might be...

But I still find the potentials irresistibly intriguing...