What is different for Visual Prolog 5 Users
This is not really a tutorial, but a quick guide to the differences between Visual Prolog 7 and Visual Prolog 5. The focus is on Visual Prolog 5 features that have been changed, rather than new features.
- 1 Dots
- 2 Predicates
- 3 Predicate Domains
- 4 Reference Domains
- 5 Function Clauses
- 6 Constants
- 7 Facts
- 8 Fact Variables
- 9 Nested Expressions and Functions
- 10 Compiler Directives
- 11 Strings
- 12 Conditional Compilation
- 13 Input, Output and Domains "file", "db_selector"
- 14 Ellipsis and Anonymous Argument Type
- 15 Objects and Classes
- 16 Library Support
All declarations (i.e. constants, domains, predicates and facts) are terminated by a dot (i.e. ".").
The syntax of predicate declarations has changed in several respects. This example illustrates most of the changes:
predicates ppp : (integer Input) procedure (i). qqq : (integer Input) -> integer Output procedure (i).
- There is a colon between the predicate name (that is always the first word in the declaration) and the predicate type.
- The return type (if any) has been moved to the end of the type expression after an arrow (i.e. "->"). There is no dash between the predicate type and the mode and flow patterns.
- The format, where the predicate mode is written in front of the declaration, does not exist anymore.In a predicate declaration the omitted predicate flow means all arguments input. Special keyword anyflow can be used in local predicate declarations to specify any flow.
The syntax of predicate domain declarations has been changed similarly:
domains pppDom = (integer Input) procedure (i). qqqDom = (integer Input) -> integer Output procedure (i).
Visual Prolog does not support reference domains since Visual Prolog 7.0 version.
See: How To Eliminate Reference Domains from a Project.
The syntax of function clauses has been changed so that the return value is placed after an equal sign in the clause head:
clauses qqq(X) = 1 :- X < 3, !. qqq(X) = X.
Constants are no longer macros, but must be values of a certain type.
constants myList : integer_list = [14, 56, -3].
The type can be omitted for number, character and string constants.
The declarations are similar to predicate declarations:
facts - myFactDB fact1 : (integer Input) nondeterm.
- Notice the colon, and that the mode declaration (i.e. nondeterm) is written in the end. Facts can still be single, determ and nondeterm.
- Facts section can be used only inside implementation of a class.
- Fact modifier nocopy is not used anymore. All facts are treated as being in nocopy mode.
- The fact sections are identified with the keyword facts. The alternative database is no longer a keyword.
Fact variables is a new notion. They are declared in facts sections:
facts myFactVariable : integer_list := [14, 56, -3].
Visual Prolog 5 users can consider this to be equivalent to the following single fact with accompanying initialization.
facts myFact : (integer_list Value) single. clauses myFact([14, 56, -3]).
Fact variables are used like variables, as it is known from imperative languages:
clauses p() :- myFactVariable := [14, 56, -3], q(myFactVariable).
Visual Prolog 5 users can consider this to be equivalent to the following code:
clauses p() :- assert(myFact( [14, 56, -3])), myFact(Value), q(Value).
Nested Expressions and Functions
Expressions and functions can be nested practically everywhere:
clauses factorial(0) = 1 :- !. factorial(N) = N * factorial(N-1).
Above you can see that the return value in the second clause is an expression. This expression contains a function call, and the argument to this function is also an expression.
Compiler directives start with #. For example:
The @ symbol before a string literal means that an escape sequence is not used, i.e. @"\n" represents 2 symbols \ and n.
The \ symbol can be used only before n, t, r, \. Therefore "\x" does not mean "x" anymore.
Characters like '\013' should be written in Unicode (and hex) format '\u000D'.
Conditional compilation can only be applied to sections in Visual Prolog 7.For example:
#if a::myconst = 1 #then clauses p(0) = 1. #endif
This Visual Prolog 5 code
clauses p(X):- ifdef debug_mode write("X",X), endif q(X).
corresponds to the following Visual Prolog 7 code:
- Compile time constant debug_mode should be put in some class. Let us name it globalConstants.
- An extra predicate is necessary to represent the part of the clause, which is inside conditional compilation.
class predicates writeX : (integer X). #if globalConstants::debug_mode = 1 #then clauses writeX(X):- stdIO::write("X=",X). #else clauses writeX(_). #endif
clauses p(X):- writeX(X), q(X).
Input, Output and Domains "file", "db_selector"
The file domain is placed into the fileSelector class. The db_selector domain is placed into the chainDBSelector class. The files pfc\5xVIP\fileSelector.cl and pfc\ChainDB\chainDBSelector.cl should be copied to a project directory (into the appropriate sub-directory) before they are modified.
These domains are introduced only for backwards compatibility. The new style is to use objects instead.
IO handling is based on streams. Stream predicates use anonymous argument type and ellipsis.
Ellipsis and Anonymous Argument Type
If a number of arguments can vary, then ellipsis is used. Ellipsis is a special notation that means "zero or more arguments of any type". The syntax is:
class predicates p : (...). clauses p(...):- stdio::write(...).
If a type of an argument is not known at compile time, anonymous argument type is used. The syntax is:
class predicates setProperty : (_).
Objects and Classes
There are significant differences between the object models in Visual Prolog 5 and Visual Prolog 7. The object model is described in Introduction to Classes and Objects.
The Library support page describes Visual Prolog 7 equivalents for Visual Prolog 5 names.
Libraries are in general new, written according to object concept. There is a special library 5xVip including sub-folders. The library is intended for migrating Visual Prolog 5 code. New programs should not use 5xVip library.