46.4.2 Example 2 - Train

This example provides a Visual Basic user interface to the Prolog program finding train routes between two points.

The Visual Basic program train contains the following form window:

images/vbsptrainform.png

Clicking the cmdRun command button will display all the available routes between Stockholm and Orebro. These are calculated as solutions of the Prolog query places('Stockholm','Örebro',Way). For each solution, the value assigned to the variable Way is retrieved into the Visual Basic variable result and is inserted as a new item into the listConnection listbox.

The Visual Basic program consists of four parts:

     Private Sub cmdRun_Click()
         Dim qid As Long
         Dim result As String
         Dim s As String
         Dim rc As Integer
     
         qid = -1 ' make it safe to PrologCloseQuery(qid) in Err:
     
         'load the train.pl Prolog file
         rc = PrologQueryCutFail("ensure_loaded(app(train))")
         If rc < 1 Then
             Msg = "ensure_loaded(train)"
             GoTo Err
         End If
         'open the query
         qid = PrologOpenQuery("places('Stockholm','Örebro',Way)")
         If qid = -1 Then
             rc = 0
             Msg = "Open places/3"
             GoTo Err
         End If
         'generate solutions
         Do
             rc = PrologNextSolution(qid)
             If rc = 0 Then Exit Do ' failed
             If rc < 0 Then
                 Msg = "places/3"
                 GoTo Err
             End If
             If PrologGetString(qid, "Way", result) < 1 Then
                 rc = 0
                 Msg = "PrologGetString Way"
                 GoTo Err
             End If
             listConnections.AddItem result
         Loop While True
         'after all solutions are found, the query is closed
         Call PrologCloseQuery(qid)
         Exit Sub

Note that each part does elaborate error checking and passes control to the error display instructions shown below:

     Err:
         Call PrologCloseQuery(qid) ' Always close opened queries
     
         'error message is prepared, adding either the - failed - or
         'the - raised exception - suffix to the Msg string specific
         'to the function called
         If rc = 0 Then
              Msg = Msg + " failed"
         Else
             Call PrologGetException(s)
             Msg = Msg + " raised exception: " + s
         End If
         MsgBox Msg, 48, "Error"
     End Sub

The Prolog predicate places/3 is defined in the train.pl file, as shown earlier (see Train Example). The only difference is the use of the Swedish characters a*, ä and ö.