Node:Example 2 - Train, Next:, Previous:Example 1 - Calculator, Up:Examples



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 ö.