We discuss P#, our implementation of a tool that allows interoperation between a concurrent superset of the Prolog programming language and C#. This enables Prolog to be used as a native implementation language for Microsoft's .NET platform. P# compiles a linear logic extension of Prolog to C# source code. We can thus create C# objects from Prolog and use C#'s graphical, networking and other libraries. We add language constructs on the Prolog side that allow concurrent Prolog code to be written. A primitive predicate is provided that evaluates a Prolog structure on a newly forked thread. Communication between threads is based on the unification of variables contained in such a structure. It is also possible for threads to communicate through a globally accessible table. All of the new features are available to the programmer through new built-in Prolog predicates. We discuss two software engineering tools implemented using P#. 816 J. J. COOK that is readable, well structured and can easily be modified by a human. Fully realizing this ideal is a long way off, but progress can be made toward it.There already exist translators that translate from Prolog to C, see [3], for example 5], Janus and Erlang. GNU-Prolog was formerly known as wamcc. There are also many Prolog tools that are based on Java, such as Prolog Café [6-10], BinProlog [11], and the commercial product MINERVA [13]. The Prolog in C translators have an emphasis on efficiency that leads them to produce unnatural code, in the case of GNU-Prolog involving jumps into functions. However, Java is more restrictive in the way in which flow of control can be programmed, for example it does not have a goto construct, and so the output of Prolog Café is more readable than that of the Prolog to C translators. As a consequence of the code being better structured, some runtime efficiency is lost, but the ability to easily use Java's libraries from Prolog is gained. With Prolog Café, Prolog code and Java code interoperate in much the same way as any other foreign language interface [14]. However, the integration is closer and more easily programmed than with, for example, a C to Java foreign language interface since in Prolog Café all of the Prolog types are internally represented as Java Objects.C# is a relatively new object-oriented programming language that has drawn on the languages C++ [15] and Java [16,17]. We now summarize the essential points of C#, see [18,19] for more details. Like Java, C# is compiled into an intermediate language. C# shares with Java some features not found in C++, such as garbage collection, reflection, thread support, static inner classes, and the ability to add finally clauses to try blocks. C# supports Java-style interfaces and abstract methods, and like Java does not allow classes to be defined by multiple inheritance. The support for concurrency is similar to that of Java, being based on locked regions and monitors. C# also shares features with C++ that are not found in Java, such as operator overloading, namespaces, jumps, enums, pr...