SWI-CS-PL – A First Glimpse


My exploration of Prolog and .NET led me to the C# interface to SWI-Prolog developed by Uwe Lesta. In the following I will present my first steps, i.e. the reproduction of the faculty Prolog program from C#. Before interoperating with SWI Prolog make sure you have correctly setup the following:

  1. Set the Path environment variable to the PL and and PL/bin directory
  2. Set the SWI_HOME_DIR environment variable to the PL directory
  3. include the SwiPlCs.dll assembly in your project

After having met these preconditions, I added the previously created faculty Prolog program (fac.pl) to the project’s directory.

Now, everything is set and we can delve into C# coding …

I created a C#-based console application. The code needs to account for the following:

  1. Initialize the SWI-Prolog engine if not done
  2. Read the number which we wish to compute the faculty of from the keyboard
  3. Consult the faculty program
  4. create a query, which retrieves the faculty of the number read in (2.)
  5. output the computed faculty
  6. clean up any bound resources

From this high level walk-through one may derive the following C# code.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using SbsSW.SwiPlCs;
   4:   
   5:  namespace PrologCSharp
   6:  {
   7:      class Program
   8:      {
   9:          static void Main(string[] args)
  10:          {
  11:              Console.WriteLine("First Prolog-CSharp");
  12:   
  13:              Console.WriteLine("compute the faculty of: ");
  14:              string facNumberStr = Console.ReadLine();
  15:   
  16:              int facNo = -1;
  17:   
  18:              /*
  19:               * read number
  20:               */
  21:              if (Int32.TryParse(facNumberStr, out facNo) == false)
  22:              {
  23:                  Console.WriteLine("Entered string is not a number!");
  24:                  return;
  25:              }
  26:   
  27:              /*
  28:               * Initialize the Prolog Engine if needed 
  29:               */
  30:              if (!PlEngine.IsInitialized)
  31:              {
  32:                  try
  33:                  {
  34:                      SbsSW.SwiPlCs.PlEngine.Initialize(new string[] { "" });
  35:                  }
  36:                  catch (System.Exception ex)
  37:                  {
  38:                      Console.WriteLine("Failure initializing Prolog: " + ex.Message);
  39:                      return;
  40:                  }
  41:              }
  42:   
  43:              /*
  44:               * Consult the faculty program
  45:               */
  46:              PlQuery.PlCall("consult(fac)");
  47:   
  48:              /*
  49:               * Construct the query to retrieve the faculty of the previously input number
  50:               * the query looks like fac(facNo, _GXYZ).
  51:               */
  52:              using (PlQuery facultyQuery = new PlQuery("fac", new PlTermV(new PlTerm(facNo), PlTerm.PlVar())))
  53:              {
  54:                  /*
  55:                   * there will only be one solution due to the cut
  56:                   * this solution has two entries:
  57:                   *   entry 1 is the faculty to compute
  58:                   *   entry 2 is the bound variable, i.e. the solution
  59:                   */
  60:                  foreach (PlTermV v in facultyQuery.Solutions)
  61:                  {
  62:                      Console.WriteLine(string.Format("the faculty of {0} is {1}", v[0].ToString(), v[1].ToString()));
  63:                  }
  64:              }
  65:   
  66:              /*
  67:               * cleanup everything
  68:               */
  69:              PlEngine.PlCleanup();
  70:   
  71:              Console.WriteLine("Press <key> to exit");
  72:              Console.ReadLine();
  73:          }
  74:      }
  75:  }

Now started, the Prolog will provide us with the faculty of 100 -

faculty

Not so bad – due to SWI Prolog’s built-in support for large numbers we did not have to do anything :). So happy interfacing and read you soon.

Comments (5)
  1. Abbas Mir says:

    hey i am getting an error "failure initializing Prolog: The Specified module could not be found"

    can you help me with this, i think i did not edit the paths properly, can you give a step to step explanation of how to change all these paths and variables before compiling the actual project.

    Thanks in advance

  2. J. says:

    Hi Abbas Mir, I had the same problem.

    First I installed the lastest version of SWI Prolog (got from here http://www.swi-prolog.org/…/stable). The destination folder is C:Program FilesSWI-Prolog

    After that i set paths:

    1. right click 'My computer' -> Properties -> tab Advanced -> Environmental variables (? I'm not sure, I use non-English version of Windows)
    2. In second list (System variables?) find variable Path, check it and click Edit

    3. In field Value add (this is MY destination folder for SWI Prolog, you must add YOURS, don't forget semi-colons):  ;C:Program FilesSWI-Prolog;C:Program FilesSWI-Prologbin and click OK

    4. Under second list click New, in field Name type SWI_HOME_DIR, in field Value type C:Program FilesSWI-Prolog (again, this is MY destination folder)

    Now download the latest version of SwiPlCS.dll from here http://www.lesta.de/…/Index.aspx

    add SwiPlCs.dll as reference to your project and have fun 🙂

  3. William Pearson says:

    FYI I have been trying to get this working with c#. It works fine for 3.5 but with 4.0 you get an error saying unbalanced stack when you call PL_Initialise.

  4. Franz Luciano says:

    Good day !  I am a fourth year college student and our thesis is about creating a GUI-IDE for prolog. We would like to use SWI-cs-pl as our compiler.  My problem is that I don't know how. We are using Visual C# in Visual studio 2008.  Please help us.

  5. christianb says:

    Following the instruction above or the more specific ones presented by "J. 26 Oct 2010 10:52 AM" should get you up and running.

Comments are closed.

Skip to main content