<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.visual-prolog.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Troels+Anker+J%C3%B8rgensen</id>
	<title>wiki.visual-prolog.com - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.visual-prolog.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Troels+Anker+J%C3%B8rgensen"/>
	<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=Special:Contributions/Troels_Anker_J%C3%B8rgensen"/>
	<updated>2026-04-11T17:02:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.visual-prolog.com/index.php?title=Compound_and_List_Domains&amp;diff=4702</id>
		<title>Compound and List Domains</title>
		<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=Compound_and_List_Domains&amp;diff=4702"/>
		<updated>2020-01-08T14:12:21Z</updated>

		<summary type="html">&lt;p&gt;Troels Anker Jørgensen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this tutorial we will introduce compound domains (sometimes called algebraic data structures). Compound domains are used to handle several pieces of data as a single entity. Lists is an example of compound domains. Lists are used so much that they have even received special syntactical sugaring.&lt;br /&gt;
&lt;br /&gt;
Compound and list domains are created using built-in domains and other compound and list domains. Visual Prolog help describes built-in domains: integral, real, string, symbol, char, string8, pointer, binary, boolean, object.&lt;br /&gt;
&lt;br /&gt;
==Compound Domains and Functors==&lt;br /&gt;
&lt;br /&gt;
Compound domains allow you to treat several pieces of information as a single item in such a way that you can easily pick them apart again. Consider, for instance, the date &amp;quot;October 15, 2003&amp;quot;. It consists of three pieces of information – the month, day, and year – but it is useful to treat the whole thing as a single data with a treelike structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;        DATE&lt;br /&gt;
         /|\&lt;br /&gt;
        / | \&lt;br /&gt;
       /  |  \&lt;br /&gt;
      /   |   \&lt;br /&gt;
  October 15  2003&amp;lt;/pre&amp;gt;You can do this by declaring a domain containing the compound domain &amp;#039;&amp;#039;&amp;#039;date&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    date_cmp = date(string Month, unsigned Day, unsigned Year).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then simply writing e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;D = date(&amp;quot;October&amp;quot;, 15, 2003),&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This looks like a Prolog fact, but it isn&amp;#039;t here – it is just a value, which you can handle in much the same way as a string or number. It begins with a name, usually called a functor(in this case date), followed by three arguments.&lt;br /&gt;
&lt;br /&gt;
Note carefully that a functor in Visual Prolog has nothing to do with a function in other programming languages. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;A functor does not stand for some computation to be performed.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; it is just a name that identifies a kind of compound value and holds its arguments together.&lt;br /&gt;
&lt;br /&gt;
The arguments of a compound value can themselves be compound. For instance, you might think of someone&amp;#039;s birthday as an information structure like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;            birthday&lt;br /&gt;
             /    \&lt;br /&gt;
            /      \&lt;br /&gt;
           /        \&lt;br /&gt;
          /          \&lt;br /&gt;
         /            \&lt;br /&gt;
   person             date&lt;br /&gt;
    /  \              / | \&lt;br /&gt;
   /    \            /  |  \&lt;br /&gt;
&amp;quot;Per&amp;quot; &amp;quot;Schultze&amp;quot;  &amp;quot;Apr&amp;quot; 14 1960&amp;lt;/pre&amp;gt;In Prolog you would write this as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;birthday(person(&amp;quot;Per&amp;quot;, &amp;quot;Schultze&amp;quot;), date(&amp;quot;Apr&amp;quot;,14,1960)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, there are two sub-parts in the compound birthday value: the argument  person(&amp;quot;Per&amp;quot;, &amp;quot;Schultze&amp;quot;) and the argument date(&amp;quot;Apr&amp;quot;, 14, 1960). The functors of these values are  person and date.&lt;br /&gt;
&lt;br /&gt;
==Unification of Compound Domains==&lt;br /&gt;
&lt;br /&gt;
A compound value can unify either with a simple variable or with a compound value that matches it(perhaps containing variables as parts of its internal structure). This means you can use a compound value to pass the whole collection of items as a single value, and then use unification to pick them apart. For example, &amp;lt;vp&amp;gt;date(&amp;quot;April&amp;quot;, 14, 1960)&amp;lt;/vp&amp;gt; matches &amp;lt;vp&amp;gt;X&amp;lt;/vp&amp;gt; and binds &amp;lt;vp&amp;gt;X&amp;lt;/vp&amp;gt; to &amp;lt;vp&amp;gt;date(&amp;quot;April&amp;quot;,14,1960)&amp;lt;/vp&amp;gt;. Also &amp;lt;vp&amp;gt;date(&amp;quot;April&amp;quot;, 14, 1960)&amp;lt;/vp&amp;gt; matches &amp;lt;vp&amp;gt;date(Mo, Da, Yr)&amp;lt;/vp&amp;gt; and binds &amp;lt;vp&amp;gt;Mo&amp;lt;/vp&amp;gt; to &amp;lt;vp&amp;gt;&amp;quot;April&amp;quot;&amp;lt;/vp&amp;gt;, &amp;lt;vp&amp;gt;Da&amp;lt;/vp&amp;gt; to &amp;lt;vp&amp;gt;14&amp;lt;/vp&amp;gt;, and &amp;lt;vp&amp;gt;Yr&amp;lt;/vp&amp;gt; to &amp;lt;vp&amp;gt;1960&amp;lt;/vp&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Using the Equal Sign to Unify Compound Domains===&lt;br /&gt;
&lt;br /&gt;
Visual Prolog performs unification in two places. The first is when a call or goal matches the head of a clause. The second is across the &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;equal&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;(=) sign, which is actually an infix predicate(a predicate that is located &amp;#039;&amp;#039;between&amp;#039;&amp;#039; its arguments rather than &amp;#039;&amp;#039;before&amp;#039;&amp;#039; them).&lt;br /&gt;
&lt;br /&gt;
Visual Prolog will make the necessary bindings to unify the values on both sides of the &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;equal&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sign. This is useful for finding the values of arguments within a compound value. For example, the following code excerpt tests if two people have the same last name, then gives the second person the same address as the first.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;class my&lt;br /&gt;
    domains&lt;br /&gt;
        person = person(name, address).&lt;br /&gt;
        name = name(string First, string Last).&lt;br /&gt;
        address = addr(street, string City, string State).&lt;br /&gt;
        street = street(integer Number, string Street_name).&lt;br /&gt;
&lt;br /&gt;
    predicates&lt;br /&gt;
        run :().&lt;br /&gt;
end class&lt;br /&gt;
&lt;br /&gt;
implement my&lt;br /&gt;
    clauses&lt;br /&gt;
        run():-&lt;br /&gt;
            console::init(),&lt;br /&gt;
            P1 =  person(name(&amp;quot;Jim&amp;quot;, &amp;quot;Smith&amp;quot;),&lt;br /&gt;
                addr(street(5, &amp;quot;1st st&amp;quot;), &amp;quot;igo&amp;quot;, &amp;quot;CA&amp;quot;)),&lt;br /&gt;
            P1 = person(name(_, &amp;quot;Smith&amp;quot;), Address),&lt;br /&gt;
            P2 = person(name(&amp;quot;Jane&amp;quot;, &amp;quot;Smith&amp;quot;), Address),&lt;br /&gt;
            !,&lt;br /&gt;
            stdio::write(&amp;quot;P1 = &amp;quot;, P1, &amp;quot;\n&amp;quot;),&lt;br /&gt;
            stdio::write(&amp;quot;P2 = &amp;quot;, P2, &amp;quot;\n&amp;quot;)&lt;br /&gt;
            ;&lt;br /&gt;
            stdio::write(&amp;quot;No solution&amp;quot;).&lt;br /&gt;
end implement&lt;br /&gt;
&lt;br /&gt;
goal&lt;br /&gt;
    my::run.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Treating Several Items as One==&lt;br /&gt;
&lt;br /&gt;
Compound values can be regarded and treated as single values in your Prolog clauses, which greatly simplifies programming. Consider, for example, the fact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, book(&amp;quot;From Here to Eternity&amp;quot;, &amp;quot;James Jones&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in which you state that John owns the book &amp;quot;From Here to Eternity&amp;quot;, written by &amp;quot;James Jones&amp;quot;. Likewise, you could write&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, horse(&amp;quot;Blacky&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which can be interpreted as&lt;br /&gt;
&lt;br /&gt;
John owns a horse named Blacky.&lt;br /&gt;
&lt;br /&gt;
The compound values in these two examples are&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;book(&amp;quot;From Here to Eternity&amp;quot;, &amp;quot;James Jones&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;horse(&amp;quot;Blacky&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you had instead written two facts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, &amp;quot;From Here to Eternity&amp;quot;).&lt;br /&gt;
owns(&amp;quot;John&amp;quot;, &amp;quot;Blacky&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you would not have been able to decide whether Blacky was the title of a book or the name of a horse. On the other hand, you can use the first component of a compound value – the functor – to distinguish between different kinds of values. This example used the functors book and horse to indicate the difference between the values.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Remember&amp;#039;&amp;#039;&amp;#039;: Compound values consist of a functor and the arguments belonging to that functor, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;functor(argument1, argument2, ..., argumentN)&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===An Example Using Compound Domains===&lt;br /&gt;
&lt;br /&gt;
An important feature of compound domains allows you to easily pass a group of values as one argument. Consider a case where you are keeping a telephone database. In your database, you want to include your friends&amp;#039; and family members&amp;#039; birthdays. Here is a section of code you might have come up with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;predicates&lt;br /&gt;
    phone_list :(string First, string Last, string Phone, string Month, intege Day, integer Year) determ.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    phone_list(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;, &amp;quot;422-0208&amp;quot;, &amp;quot;aug&amp;quot;, 3, 1955).&lt;br /&gt;
    phone_list(&amp;quot;Chris&amp;quot;, &amp;quot;Grahm&amp;quot;, &amp;quot;433-9906&amp;quot;, &amp;quot;may&amp;quot;, 12, 1962).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examine the data, noticing the six arguments in the fact phone_list; five of these arguments can be broken down into two compound domains, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;       person                birthday&lt;br /&gt;
        /   \                /  |  \&lt;br /&gt;
       /     \              /   |   \&lt;br /&gt;
First Name  Last Name    Month Day Year&amp;lt;/pre&amp;gt;It might be more useful to represent your facts so that they reflect these compound domains. Going back a step, you can see that person is a relationship, and the first and last names are the arguments. Also, birthday is a relationship with three arguments: month, day, and year. The Prolog representation of these relationships is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, &amp;quot;From Here to Eternity&amp;quot;).&lt;br /&gt;
owns(&amp;quot;John&amp;quot;, &amp;quot;Blacky&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now rewrite your small database to include these compound domains as part of your database.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    name = person(string First, string Last).&lt;br /&gt;
    birthday = b_date(string Month, integer Day, integer Year).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    phone_list : (name Name, string Ph_num, birthday Birthday) determ.&lt;br /&gt;
clauses&lt;br /&gt;
    phone_list(person(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;), &amp;quot;422-0208&amp;quot;, b_date(&amp;quot;aug&amp;quot;, 3, 1955)).&lt;br /&gt;
    phone_list(person(&amp;quot;Chris&amp;quot;, &amp;quot;Grahm&amp;quot;), &amp;quot;433-9906&amp;quot;, b_date(&amp;quot;may&amp;quot;, 12, 1962)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this program, two compound &amp;#039;&amp;#039;&amp;#039;domains&amp;#039;&amp;#039;&amp;#039; declarations were introduced. We go into more detail about these compound data structures later in this chapter. For now, we will concentrate on the benefits of using such compound domains.&lt;br /&gt;
&lt;br /&gt;
The phone_list predicate now contains three arguments, as opposed to the previous six. Sometimes breaking up your data into compound values will clarify your program and might help process the data.&lt;br /&gt;
&lt;br /&gt;
Now add some rules to program. Suppose you want to create a list of people whose birthdays are in the current month. Here is the program code to accomplish this task; this program uses the standard predicate date to get the current date from the computer&amp;#039;s internal clock. Predicate date will return the current year, month, and day from your computer&amp;#039;s clock.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;class my&lt;br /&gt;
    domains&lt;br /&gt;
        name = person(string First, string Last).&lt;br /&gt;
        birthday = b_date(string Month, integer Day, integer Year).&lt;br /&gt;
    predicates&lt;br /&gt;
        phone_list : (name Name [out], string Ph_num [out], birthday Birthday [out]) multi.&lt;br /&gt;
        get_months_birthdays : ().&lt;br /&gt;
        convert_month : (string Name, integer Num [out]) determ.&lt;br /&gt;
        check_birthday_month : (integer Month_num, birthday Birthday) determ.&lt;br /&gt;
        write_person : (name Name).&lt;br /&gt;
end class&lt;br /&gt;
&lt;br /&gt;
implement my&lt;br /&gt;
    clauses&lt;br /&gt;
        get_months_birthdays() :-&lt;br /&gt;
            stdio::write(&amp;quot;****** This Month&amp;#039;s Birthday List *****\n&amp;quot;),&lt;br /&gt;
            stdio::write(&amp;quot; First Name\t\t Last Name\n&amp;quot;),&lt;br /&gt;
            stdio::write(&amp;quot;***********************************\n&amp;quot;),&lt;br /&gt;
            Now = time::now(),&lt;br /&gt;
            Now:getDate(_, ThisMonth, _),&lt;br /&gt;
            phone_list(Person, _, Date),&lt;br /&gt;
            check_birthday_month(ThisMonth, Date),&lt;br /&gt;
            write_person(Person),&lt;br /&gt;
            fail.&lt;br /&gt;
        get_months_birthdays() :-&lt;br /&gt;
            stdio::write(&amp;quot;\n Press any key to continue:\n&amp;quot;),&lt;br /&gt;
            _ = console::readChar().&lt;br /&gt;
&lt;br /&gt;
    clauses&lt;br /&gt;
        write_person(person(FirstName, LastName)) :-&lt;br /&gt;
            stdio::write(&amp;quot;  &amp;quot;, FirstName, &amp;quot;\t\t &amp;quot;,  LastName, &amp;quot;\n&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
    clauses&lt;br /&gt;
        check_birthday_month(Mon, b_date(Month, _, _)) :-&lt;br /&gt;
            convert_month(Month, Month1),&lt;br /&gt;
            Mon = Month1.&lt;br /&gt;
&lt;br /&gt;
    clauses&lt;br /&gt;
        phone_list(person(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;), &amp;quot;11-1111&amp;quot;, b_date(&amp;quot;Jan&amp;quot;, 3, 1955)).&lt;br /&gt;
        phone_list(person(&amp;quot;Benjamin&amp;quot;, &amp;quot;Thomas&amp;quot;), &amp;quot;222-2222&amp;quot;, b_date(&amp;quot;Feb&amp;quot;, 5, 1965)).&lt;br /&gt;
        phone_list(person(&amp;quot;Ray&amp;quot;, &amp;quot;William&amp;quot;), &amp;quot;333-3333&amp;quot;, b_date(&amp;quot;Mar&amp;quot;, 3, 1955)).&lt;br /&gt;
        phone_list(person(&amp;quot;Tomas&amp;quot;, &amp;quot;Alfred&amp;quot;), &amp;quot;444-4444&amp;quot;, b_date(&amp;quot;Apr&amp;quot;, 29, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Chris&amp;quot;, &amp;quot;Gralm&amp;quot;), &amp;quot;555-5555&amp;quot;, b_date(&amp;quot;May&amp;quot;, 12, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Dastin&amp;quot;, &amp;quot;Robert&amp;quot;), &amp;quot;666-6666&amp;quot;, b_date(&amp;quot;Jun&amp;quot;, 17, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Anna&amp;quot;, &amp;quot;Friend&amp;quot;), &amp;quot;777-7777&amp;quot;, b_date(&amp;quot;Jul&amp;quot;, 2, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Naomi&amp;quot;, &amp;quot;Friend&amp;quot;), &amp;quot;888-8888&amp;quot;, b_date(&amp;quot;Aug&amp;quot;, 10, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Christina&amp;quot;, &amp;quot;Lynn&amp;quot;), &amp;quot;999-9999&amp;quot;, b_date(&amp;quot;Sep&amp;quot;, 25, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Kathy&amp;quot;, &amp;quot;Ann&amp;quot;), &amp;quot;110-1010&amp;quot;, b_date(&amp;quot;Oct&amp;quot;, 20, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Elizabeth&amp;quot;, &amp;quot;Ann&amp;quot;), &amp;quot;110-1111&amp;quot;, b_date(&amp;quot;Nov&amp;quot;, 9, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Aaron&amp;quot;, &amp;quot;Friend&amp;quot;), &amp;quot;110-1212&amp;quot;, b_date(&amp;quot;Dec&amp;quot;, 31, 1975)).&lt;br /&gt;
        phone_list(person(&amp;quot;Jenifer&amp;quot;, &amp;quot;Faitlin&amp;quot;), &amp;quot;888-8888&amp;quot;, b_date(&amp;quot;Aug&amp;quot;, 14, 1975)).&lt;br /&gt;
&lt;br /&gt;
    clauses&lt;br /&gt;
        convert_month(&amp;quot;Jan&amp;quot;, 1).&lt;br /&gt;
        convert_month(&amp;quot;Feb&amp;quot;, 2).&lt;br /&gt;
        convert_month(&amp;quot;Mar&amp;quot;, 3).&lt;br /&gt;
        convert_month(&amp;quot;Apr&amp;quot;, 4).&lt;br /&gt;
        convert_month(&amp;quot;May&amp;quot;, 5).&lt;br /&gt;
        convert_month(&amp;quot;Jun&amp;quot;, 6).&lt;br /&gt;
        convert_month(&amp;quot;Jul&amp;quot;, 7).&lt;br /&gt;
        convert_month(&amp;quot;Aug&amp;quot;, 8).&lt;br /&gt;
        convert_month(&amp;quot;Sep&amp;quot;, 9).&lt;br /&gt;
        convert_month(&amp;quot;Oct&amp;quot;, 10).&lt;br /&gt;
        convert_month(&amp;quot;Nov&amp;quot;, 11).&lt;br /&gt;
        convert_month(&amp;quot;Dec&amp;quot;, 12).&lt;br /&gt;
end implement&lt;br /&gt;
&lt;br /&gt;
goal&lt;br /&gt;
    console::init(),&lt;br /&gt;
    my::get_months_birthdays().&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How do compound domains help in this program? This should be easy to see when you examine the code. Most of the processing goes on in the get_months_birthdays predicate.&lt;br /&gt;
&lt;br /&gt;
*First, the program makes a window to display the results.&lt;br /&gt;
&lt;br /&gt;
*After this, it writes a header in the window to help interpret the results.&lt;br /&gt;
&lt;br /&gt;
*Next, in get_months_birthdays, the program uses the built-in predicate date to obtain the current month.&lt;br /&gt;
&lt;br /&gt;
*After this, the program is all set to search the database and list the people who were born in the current month. The first thing to do is find the first person in the database. The call phone_list(Person, _, Date) binds the person&amp;#039;s first and last names to the variable Person by binding the entire functor person to Person. It also binds the person&amp;#039;s birthday to the variable Date.&amp;lt;br /&amp;gt;&lt;br /&gt;
Notice that you only need to use one variable to store a person&amp;#039;s complete name, and one variable to hold the birthday. This is the power of using compound domains.&lt;br /&gt;
&lt;br /&gt;
*Your program can now pass around a person&amp;#039;s birthday simply by passing on the variable Date. This happens in the next subgoal, where the program passes the current month(represented by an integer) and the birthday(of the person it is processing) to the predicate check_birthday_month.&lt;br /&gt;
&lt;br /&gt;
*Look closely at what happens. Visual Prolog calls the predicate check_birthday_month with two variables: The first variable is bound to an integer, and the second is bound to a birthday term. In the head of the rule that defines check_birthday_month, the first argument, This_month, is matched with the variable Mon. The second argument, Date, is matched against b_date(Month, _,_).&amp;lt;br /&amp;gt;&lt;br /&gt;
Since all you are concerned with is the month of a person&amp;#039;s birthday, you have used the anonymous variable for both the day and the year of birth.&lt;br /&gt;
&lt;br /&gt;
*The predicate check_birthday_month first converts the string for the month into an integer value. Once this is done, Visual Prolog can compare the value of the current month with the value of the person&amp;#039;s birthday month. If this comparison succeeds, then the subgoal check_birthday_month succeeds, and processing can continue. If the comparison fails(the person currently being processed was not born in the current month), Visual Prolog begins to backtrack to look for another solution to the problem.&lt;br /&gt;
&lt;br /&gt;
*The next subgoal to process is write_person. The person currently being processed has a birthday this month, so it is OK to print that person&amp;#039;s name in the report. After printing the information, the clause fails, which forces backtracking.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Backtracking always goes up to the most recent non-deterministic call and tries to re-satisfy that call.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; In this program, the last non-deterministic call processed is the call to phone_list. It is here that the program looks up another person to be processed. If there are no more people in the database to process, the current clause fails; Visual Prolog then attempts to satisfy this call by looking further down in the database. Since there is another clause that defines get_months_birthdays, Visual Prolog tries to satisfy the call to get_months_birthdays by satisfying the subgoals to this other clause.&lt;br /&gt;
&lt;br /&gt;
==Declaring Compound Domains==&lt;br /&gt;
&lt;br /&gt;
In this section, we show you how instances of compound domains are defined. After compiling a program that contains the following relationships:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, book(&amp;quot;From Here to Eternity&amp;quot;, &amp;quot;James Jones&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, horse(&amp;quot;Blacky&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you could query the system with this goal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns(&amp;quot;John&amp;quot;, X))&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The variable X can be bound to a different type: a book, a horse, or perhaps other types you define. Because of your definition of the owns predicate, you can no longer employ the old predicate declaration of owns:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns :(string, string).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second argument no longer refers to the string domain. Instead, you must formulate a new declaration to the predicate, such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;owns :(name, articles).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can describe the articles domain in the domains section as shown here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    articles = book(string Title, string Author);&lt;br /&gt;
            horse(string Name).&lt;br /&gt;
        /* Articles are books or horses */&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The semicolon is read as &amp;#039;&amp;#039;or&amp;#039;&amp;#039;. In this case, two alternatives are possible: A book can be identified by its title and author, or a horse can be identified by its name. The domains title, author, and name are all of the standard domain string.&lt;br /&gt;
&lt;br /&gt;
More alternatives can easily be added to the domains declaration. For example, articles could also include a boat, a house, or a bankbook. For a boat, you can make do with a functor that has no arguments attached to it. On the other hand, you might want to give a bank balance as a figure within the bankbook. The domains declaration of  articles is therefore extended to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    articles = book(string Title, string Author);&lt;br /&gt;
            horse(string Name); boat; bankbook(real Balance).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a full program that shows how compound domains from the domain articles can be used in facts that define the predicate owns.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;class my&lt;br /&gt;
    domains&lt;br /&gt;
        articles =&lt;br /&gt;
            book(string Title, string Author) ;&lt;br /&gt;
            horse(string Name) ; boat ; bankbook(real Balance).&lt;br /&gt;
    predicates&lt;br /&gt;
        owns :(string Name, articles) nondeterm(i,o) determ(i,i).&lt;br /&gt;
end class&lt;br /&gt;
&lt;br /&gt;
implement my&lt;br /&gt;
    clauses&lt;br /&gt;
        owns(&amp;quot;John&amp;quot;, book(&amp;quot;A friend of the family&amp;quot;, &amp;quot;Irwin Shaw&amp;quot;)).&lt;br /&gt;
        owns(&amp;quot;John&amp;quot;, horse(&amp;quot;Blacky&amp;quot;)).&lt;br /&gt;
        owns(&amp;quot;John&amp;quot;, boat).&lt;br /&gt;
        owns(&amp;quot;John&amp;quot;, bankbook(1000)).&lt;br /&gt;
end implement&lt;br /&gt;
&lt;br /&gt;
goal&lt;br /&gt;
    console::init(),&lt;br /&gt;
    my::owns(&amp;quot;John&amp;quot;, Thing),&lt;br /&gt;
    stdio::write(&amp;quot;Thing: &amp;quot;, Thing, &amp;quot;\n&amp;quot;),&lt;br /&gt;
    fail&lt;br /&gt;
    ;&lt;br /&gt;
    stdio::write(&amp;quot;The end.&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now load the program into Visual Development Environment and run it in window. Visual Prolog responds with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;Thing: book(&amp;quot;A friend of the family&amp;quot;,&amp;quot;Irwin Shaw&amp;quot;)&lt;br /&gt;
Thing: horse(&amp;quot;Blacky&amp;quot;)&lt;br /&gt;
Thing: boat()&lt;br /&gt;
Thing: bankbook(1000)&lt;br /&gt;
The end.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing Domain Declarations: a Summary===&lt;br /&gt;
&lt;br /&gt;
This is a generic representation of how to write compound domain declarations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domain = alternative1(D, D, ...);&lt;br /&gt;
               alternative2(D, D, ...);&lt;br /&gt;
...&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, alternative1 and  alternative2 are arbitrary(but different) functors. The notation(D, D, ...) represents a list of domain names that are either declared elsewhere or are one of the standard domain types(such as string, integer, real, etc).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
*The alternatives are separated by semicolons.&lt;br /&gt;
&lt;br /&gt;
*Every alternative consists of a functor and, possibly, a list of domains for the corresponding arguments.&lt;br /&gt;
&lt;br /&gt;
*If the functor has no arguments, you can write it as alternativeN or alternativeN( ) in your programs.&lt;br /&gt;
&lt;br /&gt;
===Multi-Level Compound Domains===&lt;br /&gt;
&lt;br /&gt;
Visual Prolog allows you to construct compound domains on several levels. For example, in&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;book(&amp;quot;The Ugly Duckling&amp;quot;, &amp;quot;Andersen&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of using the author&amp;#039;s last name, you could use a new structure that describes the author in more detail, including both the author&amp;#039;s first and last names. By calling the functor for the resulting new compound domain author, you can change the description of the book to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;book(&amp;quot;The Ugly Duckling&amp;quot;, author(&amp;quot;Hans Christian&amp;quot;, &amp;quot;Andersen&amp;quot;)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the old domain declaration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;book(string Title, string Author).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the second argument of the book functor is Author that can only include a single name, so it is no longer sufficient. You must now specify that an author is also a compound domain made up of the author&amp;#039;s first and last name. You do this with the domain definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;author = author(string First_name, string Last_name).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which leads to the following declarations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    articles = book(string Title, author Author); ...&lt;br /&gt;
        /* First level */&lt;br /&gt;
    author = author(string First_name, string Last_name).&lt;br /&gt;
        /* Second level */&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using compound domains on different levels in this way, it is often helpful to draw a &amp;quot;tree&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;       book&lt;br /&gt;
       /  \&lt;br /&gt;
      /    \&lt;br /&gt;
  title   author&lt;br /&gt;
           /   \&lt;br /&gt;
          /     \&lt;br /&gt;
   First_name  Last_name&amp;lt;/pre&amp;gt;A domain declaration describes only one level of the tree at a time, and not the whole tree. For instance, a book can&amp;#039;t be defined with the following domain declaration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;/* Not allowed */&lt;br /&gt;
book = book(string Title, author(string First_name, string Last_name)).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compound Mixed-Domain Declarations==&lt;br /&gt;
&lt;br /&gt;
In this section, we discuss three different types of domain declarations you can add to your programs. These declarations allow you to use predicates that&lt;br /&gt;
&lt;br /&gt;
*take an argument, more than one type of more than one possible type&lt;br /&gt;
&lt;br /&gt;
*take a variable number of arguments, each of a specified type&lt;br /&gt;
&lt;br /&gt;
*take a variable number of arguments, some of which might be of more than one possible type&lt;br /&gt;
&lt;br /&gt;
===Multiple-Type Arguments===&lt;br /&gt;
&lt;br /&gt;
To allow a Visual Prolog predicate to accept an argument that gives information of different types, you must add a functor declaration. In the following example, the your_age clause will accept an argument of type age, which can be a string, a real, or an integer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    age = i(integer); r(real); s(string).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    your_age :(age).&lt;br /&gt;
clauses&lt;br /&gt;
    your_age(i(Age)) :- stdio::write(Age).&lt;br /&gt;
    your_age(r(Age)) :- stdio::write(Age).&lt;br /&gt;
    your_age(s(Age)) :- stdio::write(Age).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visual Prolog does not allow the following domain declaration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;/* Not permitted. */&lt;br /&gt;
domains&lt;br /&gt;
    age = integer; real; string.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Lists===&lt;br /&gt;
&lt;br /&gt;
Suppose you are keeping track of the different classes a professor might teach. You might produce the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;class predicates&lt;br /&gt;
    teacher :(string First_name, string Last_name, string Class) determ.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    teacher(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;, &amp;quot;english1&amp;quot;).&lt;br /&gt;
    teacher(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;, &amp;quot;math1&amp;quot;).&lt;br /&gt;
    teacher(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;, &amp;quot;history1&amp;quot;).&lt;br /&gt;
    teacher(&amp;quot;Mary&amp;quot;, &amp;quot;Maker&amp;quot;, &amp;quot;history2&amp;quot;).&lt;br /&gt;
    teacher(&amp;quot;Mary&amp;quot;, &amp;quot;Maker&amp;quot;, &amp;quot;math2&amp;quot;).&lt;br /&gt;
    teacher(&amp;quot;Chris&amp;quot;, &amp;quot;Grahm&amp;quot;, &amp;quot;geometry&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you need to repeat the teacher&amp;#039;s name for each class he or she teaches. For each class, you need to add another fact to the database. Although this is perfectly OK in this situation, you might find a school where there are hundreds of classes; this type of data structure would get a little tedious. Here, it would be helpful if you could create an argument to a predicate that could take on one &amp;#039;&amp;#039;or more&amp;#039;&amp;#039; values.&lt;br /&gt;
&lt;br /&gt;
A list in Prolog does just that. In the following code, the argument class is declared to be of a list type. We show here how a list is represented in Prolog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    classes = string*.   /* declare a list domain */&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    teacher :(string First_name,  string Last_name,  classes Classes) determ.&lt;br /&gt;
clauses&lt;br /&gt;
    teacher(&amp;quot;Ed&amp;quot;, &amp;quot;Willis&amp;quot;, [&amp;quot;english1&amp;quot;, &amp;quot;math1&amp;quot;, &amp;quot;history1&amp;quot;]).&lt;br /&gt;
    teacher(&amp;quot;Mary&amp;quot;, &amp;quot;Maker&amp;quot;, [&amp;quot;history2&amp;quot;, &amp;quot;math2&amp;quot;]).&lt;br /&gt;
    teacher(&amp;quot;Chris&amp;quot;, &amp;quot;Grahm&amp;quot;, [&amp;quot;geometry&amp;quot;]).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the code is more concise and easier to read than in the preceding one. Notice the domains declaration. The asterisk(*) means that classes is a list of strings. You can just as easily declare a list of integers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    integer_list = integer*.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you declare a domain, it is easy to use it; just place it as an argument to a predicate declared in the predicates section. Here is an example of using an integer list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    integer_list = integer*.&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    test_scores :&lt;br /&gt;
        (string First_name,&lt;br /&gt;
          string Last_name,&lt;br /&gt;
          integer_list Test_Scores)&lt;br /&gt;
          determ.&lt;br /&gt;
clauses&lt;br /&gt;
    test_scores(&amp;quot;Lisa&amp;quot;, &amp;quot;Lavender&amp;quot;, [86, 91, 75]).&lt;br /&gt;
    test_scores(&amp;quot;Libby&amp;quot;, &amp;quot;Dazzner&amp;quot;, [79, 75]).&lt;br /&gt;
    test_scores(&amp;quot;Jeff&amp;quot;, &amp;quot;Zheutlin&amp;quot;, []).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the case of &amp;#039;&amp;#039;Jeff Zheutlin&amp;#039;&amp;#039;, notice that a list doesn&amp;#039;t need to contain any elements at all.&lt;br /&gt;
&lt;br /&gt;
One more example shows how one can use lists to describe the family-tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;domains&lt;br /&gt;
    tree_list = tree*.&lt;br /&gt;
    tree = tree(string Text, tree_list TreeList).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    family :(tree) determ.&lt;br /&gt;
clauses&lt;br /&gt;
    family(tree(&amp;quot;Grandmother&amp;quot;,&lt;br /&gt;
            [tree(&amp;quot;John&amp;quot;,&lt;br /&gt;
                [tree(&amp;quot;Eric&amp;quot;, []),&lt;br /&gt;
                 tree(&amp;quot;Mark&amp;quot;, []),&lt;br /&gt;
                 tree(&amp;quot;Leonard&amp;quot;, []) ] ),&lt;br /&gt;
             tree(&amp;quot;Ellen&amp;quot;, [])&lt;br /&gt;
            ]&lt;br /&gt;
        )).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
These are the important points covered in this tutorial:&lt;br /&gt;
&lt;br /&gt;
*A Visual Prolog program can contain many types of values: simple and compound, standard and user-defined.&lt;br /&gt;
&lt;br /&gt;
*Simple values are numbers, strings, etc.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;Compound domains&amp;#039;&amp;#039; allow you to treat several pieces of information as a single item. A compound domain consists of a name(known as a functor) and one or more arguments. You can define a domain with several alternative functors.&lt;br /&gt;
&lt;br /&gt;
*A functor in Visual Prolog is not the same thing as a function in other programming languages. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;A functor does not stand for some computation to be performed.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; It is just a name that identifies a kind of a compound domain and holds its arguments together.&lt;br /&gt;
&lt;br /&gt;
*Compound values can be regarded and treated as single values; you use the functor to distinguish between different kinds of compound values. Visual Prolog allows you to construct compound values on several levels; the arguments of a compound value can also be compound values. With compound mixed domain declarations, you can use predicates that:&lt;br /&gt;
&lt;br /&gt;
*take an argument of more than one possible type(functor declaration).&lt;br /&gt;
&lt;br /&gt;
*take a variable number of arguments, each of a specified type(list declaration).&lt;br /&gt;
&lt;br /&gt;
*take a variable number of arguments, some of which might be of more than one possible type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[ru:Cоставные Домены и Списки]]&lt;br /&gt;
[[Category:Data types and handling]]&lt;/div&gt;</summary>
		<author><name>Troels Anker Jørgensen</name></author>
	</entry>
	<entry>
		<id>https://wiki.visual-prolog.com/index.php?title=Ide/Environment_Overview&amp;diff=4701</id>
		<title>Ide/Environment Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=Ide/Environment_Overview&amp;diff=4701"/>
		<updated>2020-01-06T13:11:28Z</updated>

		<summary type="html">&lt;p&gt;Troels Anker Jørgensen: /* Building */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ideNavbar|Environment Overview}}&lt;br /&gt;
&lt;br /&gt;
In this tutorial I will give an overview of the Integrated Development Environment (IDE).The IDE is used to create, develop and maintain your Visual Prolog projects.&lt;br /&gt;
&lt;br /&gt;
Briefly speaking you will use the IDE for the following tasks in a project life cycle:&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Creation&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The project is created in the IDE, at creation time you choose important properties of your project, such as whether the project is an executable or a DLL, whether it uses GUI or is text based, etc.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Building&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The project is built, i.e. compiled and linked, from the IDE.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Browsing&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The IDE and the compiler collect information about the project, which is utilized in various ways for quick localization of entities, etc.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Development&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;During the development and maintenance of the project, the IDE is used to add and remove source files and GUI entities to the project and to edit these.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Debugging&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The IDE is also used for debugging the project. The debugger is used to follow program execution and exploit the program state when the program runs.In the sequel we will look more detailed at each of these things.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notice&amp;#039;&amp;#039;&amp;#039; that the tutorial will start from scratch and create a project that is used for the whole tutorial. The reader is encouraged to do the same. Also notice that clicking on reduced pictures will show them in full scale in a separate window.&lt;br /&gt;
&lt;br /&gt;
==Creation==&lt;br /&gt;
&lt;br /&gt;
First we will create a project by selecting &amp;#039;&amp;#039;&amp;#039;Project -&amp;gt; New...&amp;#039;&amp;#039;&amp;#039; in the menu. In response to this you are presented to a dialog containing various properties of the project.&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectSettingsS.png]]&lt;br /&gt;
&lt;br /&gt;
I have chosen that my project should have the name &amp;#039;&amp;#039;tut01&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The project name is also used as the name of the target that is produced.  In this case the target is an &amp;#039;&amp;#039;exe&amp;#039;&amp;#039; file so the target name will be &amp;#039;&amp;#039;tut01.exe&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
I have also chosen that the target should be a GUI program, i.e. a program with a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Base Directory&amp;#039;&amp;#039;&amp;#039; is the &amp;quot;base&amp;quot; of all your projects; you should choose a place that is convenient for you.&lt;br /&gt;
&lt;br /&gt;
The new project will be created in a &amp;#039;&amp;#039;&amp;#039;Sub-Directory&amp;#039;&amp;#039;&amp;#039; of the base directory. By default this directory have the same name as the project itself.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Package Prefix&amp;#039;&amp;#039;&amp;#039; is used when creating new &amp;quot;packages&amp;quot; in the system (a later tutorial will explain about the package notion). In case your source files will ever be shared with somebody else it is a good idea if the prefix does not conflict with other prefixes. Therefore it is a good idea to use a prefix that start with a reverse Internet domain name, like &amp;#039;&amp;#039;com/visual-prolog &amp;#039;&amp;#039;(which is the reverse of &amp;#039;&amp;#039;visual-prolog.com&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
For the moment you do not need to consider the remaining tabs and options.&lt;br /&gt;
&lt;br /&gt;
Now create the project by pressing &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The IDE will now look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_totalS.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You have the &amp;#039;&amp;#039;&amp;#039;Project Window&amp;#039;&amp;#039;&amp;#039;, which contains information about the entities in your project. &lt;br /&gt;
You have the &amp;#039;&amp;#039;&amp;#039;Messages Window&amp;#039;&amp;#039;&amp;#039;, which will contain various status and progress messages.&lt;br /&gt;
&lt;br /&gt;
==Building==&lt;br /&gt;
&lt;br /&gt;
When you create the project, it auto builds the first time. &lt;br /&gt;
&lt;br /&gt;
However, before we make any modifications, we will try to build (i.e. compile and link) the project manually. In the &amp;#039;&amp;#039;&amp;#039;Build&amp;#039;&amp;#039;&amp;#039; menu you find commands for building, compiling and executing the project.&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;#039;&amp;#039;&amp;#039;Execute&amp;#039;&amp;#039;&amp;#039; the project is first build, so that it is an up to date version you execute. Therefore I will choose &amp;#039;&amp;#039;&amp;#039;Execute&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
If you have not registered Visual Prolog you will be presented to a special screen telling you so. I will suggest that you register, but you can also choose &amp;quot;Continue Evaluation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In the &amp;#039;&amp;#039;&amp;#039;Messages Window&amp;#039;&amp;#039;&amp;#039; the IDE writes which files are compiled, etc.&lt;br /&gt;
&lt;br /&gt;
If the build process succeeds, which it does in this case, the created program is executed. As a result you will see a little &amp;#039;&amp;#039;doing-nothing &amp;#039;&amp;#039;GUI program. You might notice that the program looks a bit like the IDE itself. This is no coincidence since the IDE is actually a Visual Prolog program.&lt;br /&gt;
&lt;br /&gt;
Later in this tutorial we will also see what happens, if the compiler or the linker detects errors in the build process.&lt;br /&gt;
&lt;br /&gt;
==Browsing==&lt;br /&gt;
&lt;br /&gt;
Right now we will turn our eyes to the &amp;#039;&amp;#039;&amp;#039;Project Tree&amp;#039;&amp;#039;&amp;#039; in the &amp;#039;&amp;#039;&amp;#039;Project Window&amp;#039;&amp;#039;&amp;#039;, and explore that a bit. The tree itself is presented in a standard Windows tree control so you should already be familiar with its usage. Here we shall concentrate on the contents of the tree.&lt;br /&gt;
&lt;br /&gt;
Right now the project tree will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow1.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
The top node represents the project, and the project directory.&lt;br /&gt;
&lt;br /&gt;
Right below that is the logical node &amp;#039;&amp;#039;&amp;#039;$(ProDir)&amp;#039;&amp;#039;&amp;#039; which represents the directory in which Visual Prolog is installed. This directory contains (as we shall shortly see) libraries and library code from the Visual Prolog system.&lt;br /&gt;
&lt;br /&gt;
Then comes another directory &amp;#039;&amp;#039;&amp;#039;TaskWindow,&amp;#039;&amp;#039;&amp;#039; which is a subdirectory of the project directory. This directory contains all the code needed to produce the Task Window, its menu and toolbar and the about dialog.&lt;br /&gt;
&lt;br /&gt;
Finally, you see a number of files. Visual Prolog uses the following conventions:&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ph&amp;#039;&amp;#039;&amp;#039; files are &amp;#039;&amp;#039;&amp;#039;package headers&amp;#039;&amp;#039;&amp;#039;. A package is a collection of classes and interfaces that are intended to be used as a chunk.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;pack&amp;#039;&amp;#039;&amp;#039; files are &amp;#039;&amp;#039;&amp;#039;packages&amp;#039;&amp;#039;&amp;#039;. They contain the implementation/definition of the corresponding .ph files.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; file contains an &amp;#039;&amp;#039;&amp;#039;interface&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;cl&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;class declaration&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;pro&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;class implementation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you expand the main.cl node completely you will see the following:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow2.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
This sub-tree shows that the file &amp;#039;&amp;#039;&amp;#039;main.cl&amp;#039;&amp;#039;&amp;#039; contains a class called &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039;, which contains the declaration of the predicate &amp;lt;vp&amp;gt;run&amp;lt;/vp&amp;gt;.  Predicates are subroutines, but they will not be considered further in this tutorial.&lt;br /&gt;
&lt;br /&gt;
If we collapse this node again and instead expand the &amp;#039;&amp;#039;&amp;#039;TaskWindow&amp;#039;&amp;#039;&amp;#039; node, you will see this tree:&lt;br /&gt;
&lt;br /&gt;
You will notice several new kinds of nodes:&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;dlg&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;dialog&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;frm&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;form&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;win&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;window&amp;#039;&amp;#039;&amp;#039; (task window or conventional PFC GUI window)&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;mnu&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;menu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ico&amp;#039;&amp;#039;&amp;#039; file contains an &amp;#039;&amp;#039;&amp;#039;icon&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you continue to explore you might also meet:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow3.png|Project Tree: TaskWindow]]&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ctl&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;controls&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;tb&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;toolbars&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;cur&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;cursors&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;bmp&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;bitmaps&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;lib&amp;#039;&amp;#039;&amp;#039; that are &amp;#039;&amp;#039;&amp;#039;libraries&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you right click on a node a context menu will appear, with commands that have relevance for that particular node.&lt;br /&gt;
&lt;br /&gt;
If you double click on a node the corresponding entity will be brought up in a suitable editor. All code is edited in a text editor, but windows resources like dialogs and menus are edited in graphical editors. We will look closer to graphical editors below, here we shall try to bring up a text editor.&lt;br /&gt;
&lt;br /&gt;
Some entities are represented twice in the tree, because they have both a declaration and a definition/implementation. For example, the predicate run in the class &amp;#039;&amp;#039;&amp;#039;tut01&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow2.png|Project Tree]] [[Image:tut01_projectWindow4.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
Try double clicking on each of the run nodes, and notice that two editors open showing the declaration and the definition of the run predicate, respectively.&lt;br /&gt;
&lt;br /&gt;
The IDE has other facilities for browsing to specific entities, but these will not be considered here.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
Now lets try to modify the project a bit. Since we have not yet concerned ourselves with how to program in Visual Prolog, we will keep the changes simple.&lt;br /&gt;
&lt;br /&gt;
We will start by deliberately introducing an error, that way you will not be completely surprised if you make some thing wrong, at the same time you can see the error window.&lt;br /&gt;
&lt;br /&gt;
First you should locate the clauses for the run predicate in the file &amp;#039;&amp;#039;&amp;#039;main.pro&amp;#039;&amp;#039;&amp;#039;. If you double click the last of the two run nodes in the project tree, an editor opens with the caret placed like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_editRun1S.png]]&lt;br /&gt;
&lt;br /&gt;
Try inserting a fail like this (notice the comma after show):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        TaskWindow = taskWindow::new(),&lt;br /&gt;
        TaskWindow:show(),&lt;br /&gt;
        fail.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that we try to build the project again: simply press the &amp;#039;&amp;#039;&amp;#039;Ctrl+Shift+B&amp;#039;&amp;#039;&amp;#039; key combination. The system will now save and compile the file, but since we have made an error, the &amp;#039;&amp;#039;&amp;#039;Error Window&amp;#039;&amp;#039;&amp;#039; will open:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_errorS.png|Error Wondow]]&lt;br /&gt;
&lt;br /&gt;
We will not consider what the error message actually means. Instead you should try to double-click on the error message. You will notice that the editor gets focus again and that the caret points exactly to the fail we inserted.&lt;br /&gt;
&lt;br /&gt;
Reestablish the code without the fail and build the project again.&lt;br /&gt;
&lt;br /&gt;
Next we will try to make a modification in the about dialog. It is not a very sensible change, but it will illustrate a number of things.&lt;br /&gt;
&lt;br /&gt;
First we will open the &amp;#039;&amp;#039;&amp;#039;About&amp;#039;&amp;#039;&amp;#039; dialog in the &amp;#039;&amp;#039;&amp;#039;Dialog Editor&amp;#039;&amp;#039;&amp;#039;, to do this you double click the dialog in the project tree. The node you have to double click is shown here:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindowAbout.png|Project Window: About Dialog]]&lt;br /&gt;
&lt;br /&gt;
Once you have clicked it you will see the dialog in the &amp;#039;&amp;#039;&amp;#039;Dialog Editor&amp;#039;&amp;#039;&amp;#039;, two toolbars and properties window.&lt;br /&gt;
&lt;br /&gt;
We will add a button to the dialog. You click on the &amp;quot;button&amp;quot; on the controls toolbar, and then you click in the dialog next to the project icon in the &amp;#039;&amp;#039;&amp;#039;AboutDialog&amp;#039;&amp;#039;&amp;#039; window. As a result you can see the properties of the new control and you can edit them. I have changed the &amp;#039;&amp;#039;&amp;#039;Text&amp;#039;&amp;#039;&amp;#039; to &amp;quot;Press Me&amp;quot;, this is the text that will appear on the button. I can also see the &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; field, the IDE will identify this particular control in various contexts by this Name.&lt;br /&gt;
&lt;br /&gt;
Now it should look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_dialogEditorAbout2.png|Dialog Editor: About Dialog with new button]]&lt;br /&gt;
&lt;br /&gt;
Now we want to do something whenever the button is pressed:&lt;br /&gt;
&lt;br /&gt;
[[Image:Tut01_dialogEditorAboutClick.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IDE has suggested the name onPushButton for the handling predicate. If you double-click the line corresponding to the event, an editor will open positioned at the newly inserted code.&lt;br /&gt;
&lt;br /&gt;
We will change the button text when the button is pressed. To do this we modify the code as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;predicates&lt;br /&gt;
    onPushButtonClick : button::clickResponder.&lt;br /&gt;
clauses&lt;br /&gt;
    onPushButtonClick(_Source) = button::defaultAction() :-&lt;br /&gt;
        pushButton_ctl:setText(&amp;quot;Pressed&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now try to build and execute the program again (i.e. press the &amp;#039;&amp;#039;&amp;#039;Ctrl+Shift+B&amp;#039;&amp;#039;&amp;#039; key combination).  If you have followed the steps carefully this should be a success. In the program you should of course open the &amp;#039;&amp;#039;&amp;#039;About&amp;#039;&amp;#039;&amp;#039; dialog, by selecting the menu entry &amp;#039;&amp;#039;&amp;#039;Help -&amp;gt; About&amp;#039;&amp;#039;&amp;#039;; and then press the new button.&lt;br /&gt;
&lt;br /&gt;
This is how it looked in my application:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_AboutPressMe.png|About: Press Me]][[Image:tut01_AboutPressed.png|About Pressed]]&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
&lt;br /&gt;
The development environment contains a debugger. With the debugger you can trace the execution of your program and examine the program state.&lt;br /&gt;
&lt;br /&gt;
It does not make much sense to go into details with debugging before you have learned the Visual Prolog language. But I will briefly explain the debugger anyway, because it can be very useful for understanding and experimenting with the language.&lt;br /&gt;
&lt;br /&gt;
To start the debugger, select &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Run&amp;#039;&amp;#039;&amp;#039; in the menu.  If the project is not up-to-date it will first be build, after that the debugging session will start.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notice&amp;#039;&amp;#039;&amp;#039; you can stop the debugging at any time by selecting &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Stop Debugging&amp;#039;&amp;#039;&amp;#039; in the menu.&lt;br /&gt;
&lt;br /&gt;
When debugging starts the IDE will first load the debug information and then it will enter the program. The program execution is stopped just before the goal is executed. To indicate this, the goal is opened in an editor window, and the blue arrow points to the goal:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_debug1.png|Editor: Current Position]]&lt;br /&gt;
&lt;br /&gt;
You can single step in the program using the &amp;#039;&amp;#039;&amp;#039;Step Into &amp;#039;&amp;#039;&amp;#039;and &amp;#039;&amp;#039;&amp;#039;Step Over&amp;#039;&amp;#039;&amp;#039; commands in the &amp;#039;&amp;#039;&amp;#039;Debug &amp;#039;&amp;#039;&amp;#039;menu.&lt;br /&gt;
&lt;br /&gt;
Try &amp;#039;&amp;#039;&amp;#039;Step Into&amp;#039;&amp;#039;&amp;#039;: this will open another editor with the code of mainExe::run, and the arrow will point to the entry of this code.&lt;br /&gt;
&lt;br /&gt;
In the view menu you can open various debugger windows, which I will briefly explain.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Run Stack&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_runStack.png|Run Stack]]&lt;br /&gt;
&lt;br /&gt;
contains a &amp;quot;picture&amp;quot; of the run stack. In principle, the run stack contains a number of lines corresponding to calls that has been made. However, optimization (so called last call optimization) might have removed some entries.&lt;br /&gt;
&lt;br /&gt;
The run stack not only shows the calls, it also shows trap points and backtrack points, these is described in a later tutorial and there I also describe the run stack window in more details.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Local Variables&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_localVariables.png|Local Variables]]&lt;br /&gt;
&lt;br /&gt;
contains the local variables corresponding to the selection in the run stack window. Some variables might not yet have received a value, these are show as an underscore (i.e. like originalraiser in the above picture).&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Facts&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_factsWindow.png|Facts]]&lt;br /&gt;
&lt;br /&gt;
Contains the global state of the program, this state is stored in fact databases. &amp;#039;&amp;#039;Fact databases &amp;#039;&amp;#039;are a unique Visual Prolog feature, which will be described in a later tutorial. You can also add objects from the &amp;#039;&amp;#039;&amp;#039;Local Variables &amp;#039;&amp;#039;&amp;#039;window to the &amp;#039;&amp;#039;&amp;#039;Facts&amp;#039;&amp;#039;&amp;#039; window, that way you can track the state changes in interesting objects.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Breakpoints &amp;#039;&amp;#039;&amp;#039;window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_breakPointsWindow.png]]&lt;br /&gt;
&lt;br /&gt;
shows the current breakpoints in the program (I have set open breakpoint so that the window would not be empty). You can set/remove breakpoints by selecting &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Toggle Breakpoint&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The remaining debug windows are for low level debugging and will not be considered here.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
The Integrated Development Environment (IDE) makes it possible for you to:&lt;br /&gt;
&lt;br /&gt;
*create&lt;br /&gt;
&lt;br /&gt;
*build&lt;br /&gt;
&lt;br /&gt;
*maintain, and&lt;br /&gt;
&lt;br /&gt;
*debug&lt;br /&gt;
&lt;br /&gt;
your projects. It contains a number of tools, editor and wizards that will help you in your tasks.&lt;br /&gt;
&lt;br /&gt;
[[ru:Среда_разработки]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Troels Anker Jørgensen</name></author>
	</entry>
	<entry>
		<id>https://wiki.visual-prolog.com/index.php?title=Ide/Environment_Overview&amp;diff=4700</id>
		<title>Ide/Environment Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=Ide/Environment_Overview&amp;diff=4700"/>
		<updated>2020-01-06T13:06:31Z</updated>

		<summary type="html">&lt;p&gt;Troels Anker Jørgensen: /* Creation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ideNavbar|Environment Overview}}&lt;br /&gt;
&lt;br /&gt;
In this tutorial I will give an overview of the Integrated Development Environment (IDE).The IDE is used to create, develop and maintain your Visual Prolog projects.&lt;br /&gt;
&lt;br /&gt;
Briefly speaking you will use the IDE for the following tasks in a project life cycle:&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Creation&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The project is created in the IDE, at creation time you choose important properties of your project, such as whether the project is an executable or a DLL, whether it uses GUI or is text based, etc.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Building&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The project is built, i.e. compiled and linked, from the IDE.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Browsing&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The IDE and the compiler collect information about the project, which is utilized in various ways for quick localization of entities, etc.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Development&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;During the development and maintenance of the project, the IDE is used to add and remove source files and GUI entities to the project and to edit these.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Debugging&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;The IDE is also used for debugging the project. The debugger is used to follow program execution and exploit the program state when the program runs.In the sequel we will look more detailed at each of these things.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notice&amp;#039;&amp;#039;&amp;#039; that the tutorial will start from scratch and create a project that is used for the whole tutorial. The reader is encouraged to do the same. Also notice that clicking on reduced pictures will show them in full scale in a separate window.&lt;br /&gt;
&lt;br /&gt;
==Creation==&lt;br /&gt;
&lt;br /&gt;
First we will create a project by selecting &amp;#039;&amp;#039;&amp;#039;Project -&amp;gt; New...&amp;#039;&amp;#039;&amp;#039; in the menu. In response to this you are presented to a dialog containing various properties of the project.&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectSettingsS.png]]&lt;br /&gt;
&lt;br /&gt;
I have chosen that my project should have the name &amp;#039;&amp;#039;tut01&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The project name is also used as the name of the target that is produced.  In this case the target is an &amp;#039;&amp;#039;exe&amp;#039;&amp;#039; file so the target name will be &amp;#039;&amp;#039;tut01.exe&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
I have also chosen that the target should be a GUI program, i.e. a program with a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Base Directory&amp;#039;&amp;#039;&amp;#039; is the &amp;quot;base&amp;quot; of all your projects; you should choose a place that is convenient for you.&lt;br /&gt;
&lt;br /&gt;
The new project will be created in a &amp;#039;&amp;#039;&amp;#039;Sub-Directory&amp;#039;&amp;#039;&amp;#039; of the base directory. By default this directory have the same name as the project itself.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Package Prefix&amp;#039;&amp;#039;&amp;#039; is used when creating new &amp;quot;packages&amp;quot; in the system (a later tutorial will explain about the package notion). In case your source files will ever be shared with somebody else it is a good idea if the prefix does not conflict with other prefixes. Therefore it is a good idea to use a prefix that start with a reverse Internet domain name, like &amp;#039;&amp;#039;com/visual-prolog &amp;#039;&amp;#039;(which is the reverse of &amp;#039;&amp;#039;visual-prolog.com&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
For the moment you do not need to consider the remaining tabs and options.&lt;br /&gt;
&lt;br /&gt;
Now create the project by pressing &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The IDE will now look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_totalS.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You have the &amp;#039;&amp;#039;&amp;#039;Project Window&amp;#039;&amp;#039;&amp;#039;, which contains information about the entities in your project. &lt;br /&gt;
You have the &amp;#039;&amp;#039;&amp;#039;Messages Window&amp;#039;&amp;#039;&amp;#039;, which will contain various status and progress messages.&lt;br /&gt;
&lt;br /&gt;
==Building==&lt;br /&gt;
&lt;br /&gt;
Before we make any modifications, we will build (i.e. compile and link) the project. In the &amp;#039;&amp;#039;&amp;#039;Build&amp;#039;&amp;#039;&amp;#039; menu you find commands for building, compiling and executing the project.&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;#039;&amp;#039;&amp;#039;Execute&amp;#039;&amp;#039;&amp;#039; the project is first build, so that it is an up to date version you execute. Therefore I will choose &amp;#039;&amp;#039;&amp;#039;Execute&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
If you have not registered Visual Prolog you will be presented to a special screen telling you so. I will suggest that you register, but you can also choose &amp;quot;Continue Evaluation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In the &amp;#039;&amp;#039;&amp;#039;Messages Window&amp;#039;&amp;#039;&amp;#039; the IDE writes which files are compiled, etc.&lt;br /&gt;
&lt;br /&gt;
If the build process succeeds, which it does in this case, the created program is executed. As a result you will see a little &amp;#039;&amp;#039;doing-nothing &amp;#039;&amp;#039;GUI program. You might notice that the program looks a bit like the IDE itself. This is no coincidence since the IDE is actually a Visual Prolog program.&lt;br /&gt;
&lt;br /&gt;
Later in this tutorial we will also see what happens, if the compiler or the linker detects errors in the build process.&lt;br /&gt;
&lt;br /&gt;
==Browsing==&lt;br /&gt;
&lt;br /&gt;
Right now we will turn our eyes to the &amp;#039;&amp;#039;&amp;#039;Project Tree&amp;#039;&amp;#039;&amp;#039; in the &amp;#039;&amp;#039;&amp;#039;Project Window&amp;#039;&amp;#039;&amp;#039;, and explore that a bit. The tree itself is presented in a standard Windows tree control so you should already be familiar with its usage. Here we shall concentrate on the contents of the tree.&lt;br /&gt;
&lt;br /&gt;
Right now the project tree will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow1.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
The top node represents the project, and the project directory.&lt;br /&gt;
&lt;br /&gt;
Right below that is the logical node &amp;#039;&amp;#039;&amp;#039;$(ProDir)&amp;#039;&amp;#039;&amp;#039; which represents the directory in which Visual Prolog is installed. This directory contains (as we shall shortly see) libraries and library code from the Visual Prolog system.&lt;br /&gt;
&lt;br /&gt;
Then comes another directory &amp;#039;&amp;#039;&amp;#039;TaskWindow,&amp;#039;&amp;#039;&amp;#039; which is a subdirectory of the project directory. This directory contains all the code needed to produce the Task Window, its menu and toolbar and the about dialog.&lt;br /&gt;
&lt;br /&gt;
Finally, you see a number of files. Visual Prolog uses the following conventions:&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ph&amp;#039;&amp;#039;&amp;#039; files are &amp;#039;&amp;#039;&amp;#039;package headers&amp;#039;&amp;#039;&amp;#039;. A package is a collection of classes and interfaces that are intended to be used as a chunk.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;pack&amp;#039;&amp;#039;&amp;#039; files are &amp;#039;&amp;#039;&amp;#039;packages&amp;#039;&amp;#039;&amp;#039;. They contain the implementation/definition of the corresponding .ph files.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; file contains an &amp;#039;&amp;#039;&amp;#039;interface&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;cl&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;class declaration&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;pro&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;class implementation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you expand the main.cl node completely you will see the following:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow2.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
This sub-tree shows that the file &amp;#039;&amp;#039;&amp;#039;main.cl&amp;#039;&amp;#039;&amp;#039; contains a class called &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039;, which contains the declaration of the predicate &amp;lt;vp&amp;gt;run&amp;lt;/vp&amp;gt;.  Predicates are subroutines, but they will not be considered further in this tutorial.&lt;br /&gt;
&lt;br /&gt;
If we collapse this node again and instead expand the &amp;#039;&amp;#039;&amp;#039;TaskWindow&amp;#039;&amp;#039;&amp;#039; node, you will see this tree:&lt;br /&gt;
&lt;br /&gt;
You will notice several new kinds of nodes:&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;dlg&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;dialog&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;frm&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;form&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;win&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;window&amp;#039;&amp;#039;&amp;#039; (task window or conventional PFC GUI window)&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;mnu&amp;#039;&amp;#039;&amp;#039; file contains a &amp;#039;&amp;#039;&amp;#039;menu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ico&amp;#039;&amp;#039;&amp;#039; file contains an &amp;#039;&amp;#039;&amp;#039;icon&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you continue to explore you might also meet:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow3.png|Project Tree: TaskWindow]]&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;ctl&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;controls&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;tb&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;toolbars&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;cur&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;cursors&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;bmp&amp;#039;&amp;#039;&amp;#039; files containing &amp;#039;&amp;#039;&amp;#039;bitmaps&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*.&amp;#039;&amp;#039;&amp;#039;lib&amp;#039;&amp;#039;&amp;#039; that are &amp;#039;&amp;#039;&amp;#039;libraries&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you right click on a node a context menu will appear, with commands that have relevance for that particular node.&lt;br /&gt;
&lt;br /&gt;
If you double click on a node the corresponding entity will be brought up in a suitable editor. All code is edited in a text editor, but windows resources like dialogs and menus are edited in graphical editors. We will look closer to graphical editors below, here we shall try to bring up a text editor.&lt;br /&gt;
&lt;br /&gt;
Some entities are represented twice in the tree, because they have both a declaration and a definition/implementation. For example, the predicate run in the class &amp;#039;&amp;#039;&amp;#039;tut01&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindow2.png|Project Tree]] [[Image:tut01_projectWindow4.png|Project Tree]]&lt;br /&gt;
&lt;br /&gt;
Try double clicking on each of the run nodes, and notice that two editors open showing the declaration and the definition of the run predicate, respectively.&lt;br /&gt;
&lt;br /&gt;
The IDE has other facilities for browsing to specific entities, but these will not be considered here.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
Now lets try to modify the project a bit. Since we have not yet concerned ourselves with how to program in Visual Prolog, we will keep the changes simple.&lt;br /&gt;
&lt;br /&gt;
We will start by deliberately introducing an error, that way you will not be completely surprised if you make some thing wrong, at the same time you can see the error window.&lt;br /&gt;
&lt;br /&gt;
First you should locate the clauses for the run predicate in the file &amp;#039;&amp;#039;&amp;#039;main.pro&amp;#039;&amp;#039;&amp;#039;. If you double click the last of the two run nodes in the project tree, an editor opens with the caret placed like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_editRun1S.png]]&lt;br /&gt;
&lt;br /&gt;
Try inserting a fail like this (notice the comma after show):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        TaskWindow = taskWindow::new(),&lt;br /&gt;
        TaskWindow:show(),&lt;br /&gt;
        fail.&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that we try to build the project again: simply press the &amp;#039;&amp;#039;&amp;#039;Ctrl+Shift+B&amp;#039;&amp;#039;&amp;#039; key combination. The system will now save and compile the file, but since we have made an error, the &amp;#039;&amp;#039;&amp;#039;Error Window&amp;#039;&amp;#039;&amp;#039; will open:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_errorS.png|Error Wondow]]&lt;br /&gt;
&lt;br /&gt;
We will not consider what the error message actually means. Instead you should try to double-click on the error message. You will notice that the editor gets focus again and that the caret points exactly to the fail we inserted.&lt;br /&gt;
&lt;br /&gt;
Reestablish the code without the fail and build the project again.&lt;br /&gt;
&lt;br /&gt;
Next we will try to make a modification in the about dialog. It is not a very sensible change, but it will illustrate a number of things.&lt;br /&gt;
&lt;br /&gt;
First we will open the &amp;#039;&amp;#039;&amp;#039;About&amp;#039;&amp;#039;&amp;#039; dialog in the &amp;#039;&amp;#039;&amp;#039;Dialog Editor&amp;#039;&amp;#039;&amp;#039;, to do this you double click the dialog in the project tree. The node you have to double click is shown here:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_projectWindowAbout.png|Project Window: About Dialog]]&lt;br /&gt;
&lt;br /&gt;
Once you have clicked it you will see the dialog in the &amp;#039;&amp;#039;&amp;#039;Dialog Editor&amp;#039;&amp;#039;&amp;#039;, two toolbars and properties window.&lt;br /&gt;
&lt;br /&gt;
We will add a button to the dialog. You click on the &amp;quot;button&amp;quot; on the controls toolbar, and then you click in the dialog next to the project icon in the &amp;#039;&amp;#039;&amp;#039;AboutDialog&amp;#039;&amp;#039;&amp;#039; window. As a result you can see the properties of the new control and you can edit them. I have changed the &amp;#039;&amp;#039;&amp;#039;Text&amp;#039;&amp;#039;&amp;#039; to &amp;quot;Press Me&amp;quot;, this is the text that will appear on the button. I can also see the &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; field, the IDE will identify this particular control in various contexts by this Name.&lt;br /&gt;
&lt;br /&gt;
Now it should look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_dialogEditorAbout2.png|Dialog Editor: About Dialog with new button]]&lt;br /&gt;
&lt;br /&gt;
Now we want to do something whenever the button is pressed:&lt;br /&gt;
&lt;br /&gt;
[[Image:Tut01_dialogEditorAboutClick.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IDE has suggested the name onPushButton for the handling predicate. If you double-click the line corresponding to the event, an editor will open positioned at the newly inserted code.&lt;br /&gt;
&lt;br /&gt;
We will change the button text when the button is pressed. To do this we modify the code as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;predicates&lt;br /&gt;
    onPushButtonClick : button::clickResponder.&lt;br /&gt;
clauses&lt;br /&gt;
    onPushButtonClick(_Source) = button::defaultAction() :-&lt;br /&gt;
        pushButton_ctl:setText(&amp;quot;Pressed&amp;quot;).&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now try to build and execute the program again (i.e. press the &amp;#039;&amp;#039;&amp;#039;Ctrl+Shift+B&amp;#039;&amp;#039;&amp;#039; key combination).  If you have followed the steps carefully this should be a success. In the program you should of course open the &amp;#039;&amp;#039;&amp;#039;About&amp;#039;&amp;#039;&amp;#039; dialog, by selecting the menu entry &amp;#039;&amp;#039;&amp;#039;Help -&amp;gt; About&amp;#039;&amp;#039;&amp;#039;; and then press the new button.&lt;br /&gt;
&lt;br /&gt;
This is how it looked in my application:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_AboutPressMe.png|About: Press Me]][[Image:tut01_AboutPressed.png|About Pressed]]&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
&lt;br /&gt;
The development environment contains a debugger. With the debugger you can trace the execution of your program and examine the program state.&lt;br /&gt;
&lt;br /&gt;
It does not make much sense to go into details with debugging before you have learned the Visual Prolog language. But I will briefly explain the debugger anyway, because it can be very useful for understanding and experimenting with the language.&lt;br /&gt;
&lt;br /&gt;
To start the debugger, select &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Run&amp;#039;&amp;#039;&amp;#039; in the menu.  If the project is not up-to-date it will first be build, after that the debugging session will start.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notice&amp;#039;&amp;#039;&amp;#039; you can stop the debugging at any time by selecting &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Stop Debugging&amp;#039;&amp;#039;&amp;#039; in the menu.&lt;br /&gt;
&lt;br /&gt;
When debugging starts the IDE will first load the debug information and then it will enter the program. The program execution is stopped just before the goal is executed. To indicate this, the goal is opened in an editor window, and the blue arrow points to the goal:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_debug1.png|Editor: Current Position]]&lt;br /&gt;
&lt;br /&gt;
You can single step in the program using the &amp;#039;&amp;#039;&amp;#039;Step Into &amp;#039;&amp;#039;&amp;#039;and &amp;#039;&amp;#039;&amp;#039;Step Over&amp;#039;&amp;#039;&amp;#039; commands in the &amp;#039;&amp;#039;&amp;#039;Debug &amp;#039;&amp;#039;&amp;#039;menu.&lt;br /&gt;
&lt;br /&gt;
Try &amp;#039;&amp;#039;&amp;#039;Step Into&amp;#039;&amp;#039;&amp;#039;: this will open another editor with the code of mainExe::run, and the arrow will point to the entry of this code.&lt;br /&gt;
&lt;br /&gt;
In the view menu you can open various debugger windows, which I will briefly explain.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Run Stack&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_runStack.png|Run Stack]]&lt;br /&gt;
&lt;br /&gt;
contains a &amp;quot;picture&amp;quot; of the run stack. In principle, the run stack contains a number of lines corresponding to calls that has been made. However, optimization (so called last call optimization) might have removed some entries.&lt;br /&gt;
&lt;br /&gt;
The run stack not only shows the calls, it also shows trap points and backtrack points, these is described in a later tutorial and there I also describe the run stack window in more details.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Local Variables&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_localVariables.png|Local Variables]]&lt;br /&gt;
&lt;br /&gt;
contains the local variables corresponding to the selection in the run stack window. Some variables might not yet have received a value, these are show as an underscore (i.e. like originalraiser in the above picture).&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Facts&amp;#039;&amp;#039;&amp;#039; window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_factsWindow.png|Facts]]&lt;br /&gt;
&lt;br /&gt;
Contains the global state of the program, this state is stored in fact databases. &amp;#039;&amp;#039;Fact databases &amp;#039;&amp;#039;are a unique Visual Prolog feature, which will be described in a later tutorial. You can also add objects from the &amp;#039;&amp;#039;&amp;#039;Local Variables &amp;#039;&amp;#039;&amp;#039;window to the &amp;#039;&amp;#039;&amp;#039;Facts&amp;#039;&amp;#039;&amp;#039; window, that way you can track the state changes in interesting objects.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Breakpoints &amp;#039;&amp;#039;&amp;#039;window:&lt;br /&gt;
&lt;br /&gt;
[[Image:tut01_breakPointsWindow.png]]&lt;br /&gt;
&lt;br /&gt;
shows the current breakpoints in the program (I have set open breakpoint so that the window would not be empty). You can set/remove breakpoints by selecting &amp;#039;&amp;#039;&amp;#039;Debug -&amp;gt; Toggle Breakpoint&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The remaining debug windows are for low level debugging and will not be considered here.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
The Integrated Development Environment (IDE) makes it possible for you to:&lt;br /&gt;
&lt;br /&gt;
*create&lt;br /&gt;
&lt;br /&gt;
*build&lt;br /&gt;
&lt;br /&gt;
*maintain, and&lt;br /&gt;
&lt;br /&gt;
*debug&lt;br /&gt;
&lt;br /&gt;
your projects. It contains a number of tools, editor and wizards that will help you in your tasks.&lt;br /&gt;
&lt;br /&gt;
[[ru:Среда_разработки]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Troels Anker Jørgensen</name></author>
	</entry>
	<entry>
		<id>https://wiki.visual-prolog.com/index.php?title=File:Tut01_projectSettingsS.png&amp;diff=4699</id>
		<title>File:Tut01 projectSettingsS.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=File:Tut01_projectSettingsS.png&amp;diff=4699"/>
		<updated>2020-01-06T13:02:46Z</updated>

		<summary type="html">&lt;p&gt;Troels Anker Jørgensen: Troels Anker Jørgensen uploaded a new version of File:Tut01 projectSettingsS.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Troels Anker Jørgensen</name></author>
	</entry>
	<entry>
		<id>https://wiki.visual-prolog.com/index.php?title=File:Tut01_projectSettingsS.png&amp;diff=4698</id>
		<title>File:Tut01 projectSettingsS.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.visual-prolog.com/index.php?title=File:Tut01_projectSettingsS.png&amp;diff=4698"/>
		<updated>2020-01-06T12:48:10Z</updated>

		<summary type="html">&lt;p&gt;Troels Anker Jørgensen: Troels Anker Jørgensen uploaded a new version of File:Tut01 projectSettingsS.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Troels Anker Jørgensen</name></author>
	</entry>
</feed>