Difference between revisions of "VIP7 Construct examples"
m |
m (formatting) |
||
Line 1: | Line 1: | ||
This page contains a collection of basic examples for (mainly) the newer constructs found in VIP7. | This page contains a collection of basic examples for (mainly) the newer constructs found in VIP7. | ||
=== Fact variables === | |||
=== | |||
Fact variables are the only mutable types in VIP. | Fact variables are the only mutable types in VIP. | ||
Line 9: | Line 8: | ||
<vip>facts | <vip>facts | ||
ndb_int:(integer). % a nondeterministic fact (0 to any number of values) | |||
db_int:(integer,string) determ. % a deterministic fact (0 to 1 value)</vip> | |||
</vip> | |||
These types of fact are asserted and retracted. | These types of fact are asserted and retracted. | ||
'''Examples - "fact variables"''' | '''Examples - "fact variables"''' | ||
<vip>facts | <vip>facts | ||
zz_int:integer:=0. | |||
zz_fred:integer:=erroneous. | |||
domains | domains | ||
dom=dom(string,chaindb:ref). | |||
facts | facts | ||
zz_dom:dom:=erroneous. | |||
clauses | clauses | ||
pred():- | |||
zz_int:=7, | |||
stdio::write("\n zz_int = ",zz_int), %will write "zz_int=7" | |||
zz_int:=zz_int+20, | |||
stdio::write("\n zz_int = ",zz_int), %will write "zz_int=27" | |||
succeed.</vip> | |||
</vip> | |||
A fact variable is great for counting eg. | A fact variable is great for counting eg. | ||
<vip>predicates | <vip>predicates | ||
pred:()=integer Count. | |||
clauses | clauses | ||
pred()=_:- | |||
zz_int:=0, | |||
some_nondeterm_fact_or_pred(), | |||
zz_int:=zz_int+1, | |||
fail. | |||
pred()=zz_int.</vip> | |||
</vip> | |||
=== | === Lists - findall and list comprehension === | ||
See [http://wiki.visual-prolog.com/index.php?title=Lists_and_Recursion Lists and Recursion]<br> | See [http://wiki.visual-prolog.com/index.php?title=Lists_and_Recursion Lists and Recursion]<br> | ||
<vp>findall()</vp> has been depricated, so use the list comprehension construct. | |||
'''Examples''' | '''Examples''' | ||
<vip>facts | <vip>facts | ||
ndb:(integer). %default is nondeterm for a fact | |||
clauses | clauses | ||
ndb(1). | |||
ndb(2). | |||
ndb(3). | |||
.... | |||
ndb(10). | |||
clauses | clauses | ||
pred_old():- | |||
findall(X,ndb(X),List). | |||
%results in List = [1,2,3,4,5,6,7,8,9,10] | |||
clauses | clauses | ||
pred_new():- | |||
List=[X||ndb(X)]. | |||
%results in List = [1,2,3,4,5,6,7,8,9,10] | |||
clauses | clauses | ||
pred_filter():- | |||
List=[X||ndb(X), X>6]. | |||
%results in List = [7,8,9,10] | |||
pred_filter():- | |||
List=[X||ndb(X), X mod 2=0]. | |||
%results in List = [2,4,6,8,10] | |||
pred_filter():- | |||
List=[X||ndb(X), X mod 2=0, X<7]. | |||
%results in List = [2,4,6] | |||
pred_filter():- | |||
zz_int:=0, | |||
List=[X||ndb(X), X mod 2=0, X<7, zz_int:=zz_int+1]. | |||
%results in List = [2,4,6] and zz_int=3. | |||
=== | pred_filter():- | ||
List=[X||ndb(X), Y=pred2(X), Y>10]. %with pred2(X)=X^2. | |||
%results in List = [4,5,6,7,8,9,10] | |||
%reason - X=3 gives Y=9 which is < 10. | |||
pred_other():- | |||
L=[1,2,3,4,5,6,7,8,9,10], | |||
LIST=[ X || X = list::getMember_nd(L)]. | |||
%results in List= L</vip> | |||
=== if-then-else (code) === | |||
'''Examples''' | '''Examples''' | ||
<vip>clauses | <vip>clauses | ||
pred(X):- | |||
if X>0 then | |||
stdio::write("\n X>0") %the last line in each block has no comma | |||
else | |||
stdio::write("\n X<=0") | |||
end if. | |||
pred(X):- | |||
if X>0 then | |||
stdio::write("\n X>0") | |||
elseif X = 0 then | |||
stdio::write("\n X=0") | |||
else | |||
stdio::write("\n X<0") | |||
end if. | |||
clauses | clauses | ||
pred(X,Y)=Z:- | |||
if X=0 then | |||
Z="x is zero" | |||
elseif X>0 then | |||
if pred3(Y)=true then | |||
Z="x>0 and pred(Y) is true" | |||
else | |||
Z="x>0 and pred(Y) is false" | |||
end if %note, no comma here either | |||
else | |||
Z="x <0" | |||
end if.</vip> | |||
</vip> | |||
===# | === #if #then #else (directive for conditional compilation) === | ||
'''Examples''' | '''Examples''' | ||
<vip>constants | |||
u64_con=1. | |||
int_con=2. | |||
real_con=3. | |||
compile_big_con=u64_con. %change this and then recompile. | |||
#if compile_big_con=u64_con #then | #if compile_big_con=u64_con #then | ||
predicates | |||
pred:()->unsigned64. | |||
clauses | |||
pred()=U64:- | |||
U64=78766. | |||
#elseif compile_big_con=int_con #then | #elseif compile_big_con=int_con #then | ||
predicates | |||
pred:()->integer. | |||
clauses | |||
pred()=Int:- | |||
Int=20. | |||
#else | #else | ||
predicates | |||
pred:(real [out]). | |||
clauses | |||
pred(0.766). | |||
#endif</vip> | |||
'''Note'''<br> | '''Note'''<br> | ||
Code construct uses | Code construct uses <vp>if - then</vp>, <vp>elseif - then</vp>, <vp>else</vp>, <vp>end if</vp> <br> | ||
compiler directive uses | compiler directive uses <vp>#if - #then</vp>, <vp>#elseif - #then</vp>, <vp>#else</vp>, <vp>#endif</vp> | ||
<br>(just the "end if" is "different") | <br>(just the "end if" is "different") | ||
=== | === Trap and try/catch/finally === | ||
See [http://wiki.visual-prolog.com/index.php?title=Language_Reference/Terms/Try-catch-finally Try-catch-finally]<br> | See [http://wiki.visual-prolog.com/index.php?title=Language_Reference/Terms/Try-catch-finally Try-catch-finally]<br> | ||
Note, in | Note, in | ||
[http://wiki.visual-prolog.com/index.php?title=Language_Reference/Built-in_entities/Predicates Built-in entities/Predicates]<br> | [http://wiki.visual-prolog.com/index.php?title=Language_Reference/Built-in_entities/Predicates Built-in entities/Predicates]<br> | ||
suggests using | suggests using <vp>try-end try</vp> instead of <vp>trap(_,_,_)</vp> | ||
'''Example 1''' | '''Example 1''' | ||
<vip> | |||
<vip>clauses | |||
pred_all():- | |||
try | |||
call_pred_that_might_crash(0) | |||
catch ErrorNo do | |||
call_own_exception_pred(ErrorNo) | |||
finally | |||
always_call_this_anyway() | |||
end try. | |||
class predicates | class predicates | ||
call_pred_that_might_crash:(integer). | |||
call_own_exception_pred:(pointer ErrorNo). | |||
always_call_this_anyway:(). | |||
clauses | clauses | ||
call_pred_that_might_crash(X):- | |||
Y=9/X. | |||
call_own_exception_pred(ErrorNo):- | |||
vpiCommonDialogs::note("crashed"). | |||
always_call_this_anyway():- | |||
vpiCommonDialogs::note("finally reached").</vip> | |||
'''Example 2''' | '''Example 2''' | ||
<vip> | |||
<vip>clauses | |||
pred_some():- | |||
try | |||
call_pred_that_might_crash(0) | |||
finally | |||
always_call_this_anyway() | |||
</vip> | end try.</vip> | ||
% in this case, VIP will automatically pop up its exception dialog | % in this case, VIP will automatically pop up its exception dialog | ||
'''Example 3''' | '''Example 3''' | ||
===64 | <vip>clauses | ||
pred_some():- | |||
try | |||
call_pred_that_might_crash(0) | |||
catch ErrorNo do | |||
call_own_exception_pred(ErrorNo) | |||
end try.</vip> | |||
'''Example 4''' - illegal - it must have a <vp>catch</vp> or <vp>finally</vp> | |||
<vip>clauses | |||
pred_illegal():- | |||
try | |||
call_pred_that_might_crash(0) | |||
end try.</vip> | |||
=== 64 bit numbers === | |||
=== Properties === | |||
Properties in a class are used almost identically to fact variables, but properties can be set directly (from another class), without having to declare a public predicate to make the change. | Properties in a class are used almost identically to fact variables, but properties can be set directly (from another class), without having to declare a public predicate to make the change. | ||
'''Example''' | '''Example''' | ||
<vip> | |||
interface fred | <vip>interface fred | ||
domains | |||
complete_dom=is_complete; | |||
not_complete. | |||
properties | |||
prop_complete : complete_dom. | |||
end interface fred | end interface fred</vip> | ||
</vip> | |||
In fred.pro: | In fred.pro: | ||
<vip> | |||
facts | <vip>facts | ||
zz_complete:complete_dom:=erroneous. | |||
clauses %for the property | clauses %for the property | ||
prop_complete()=zz_complete. %get | |||
prop_complete(COMPLETE):-zz_complete:=COMPLETE. %set</vip> | |||
</vip> | |||
In some other class that calls class fred: | In some other class that calls class fred: | ||
<vip> | |||
implement other | <vip>implement other | ||
open fred | |||
clauses | clauses | ||
pred():- | |||
Fred=fred::new(), | |||
Fred:prop_complete:=is_complete,% to set the value | |||
Value=Fred:prop_complete,!. %get</vip> | |||
</vip> | |||
=== | === Comparators and compare === | ||
=== Anonymous predicates === | |||
''(under development)'' | |||
See [http://wiki.visual-prolog.com/index.php?title=Language_Reference/Terms/Anonymous_Predicates Anonymous_Predicates] | |||
'''Examples''' | '''Examples''' | ||
<vip> | |||
<vip>clauses | |||
run() :- | |||
Anon={()=9}, | |||
K=Anon(). | |||
%results in K=9 | %results in K=9 | ||
run() :- | |||
Anon={=88}, | |||
K=Anon(). | |||
%results in K=88. | |||
run():- | |||
Anon={(A,B)=A+B}, | |||
K=Anon(4,8), | |||
%results in K=12. | |||
run():- | |||
Anon={ | |||
(A,B)=C:- | |||
R=math::random(7), | |||
C=A+B+R, | |||
stdio::wRite("RRRR=",R) | |||
}, | |||
K=Anon(4,8). | |||
%results in K=12 + a random number <7 | %results in K=12 + a random number <7 | ||
run():- | |||
Anon={=f_abc(3)}, | |||
K=Anon(), | |||
stdio::write("\nI={=f_abc(3)} gives ",K), | |||
fail. | |||
run().</vip> | |||
</vip> | |||
=== | |||
=== Threads === | |||
To start a thread: | To start a thread: | ||
<vip> | |||
clauses | <vip>clauses | ||
pred():- | |||
_=thread::start(fred). | |||
predicates | predicates | ||
fred:(). | |||
clauses | clauses | ||
fred():-.....</vip> | |||
</vip> | |||
fred can have no arguments, so no argument brackets are allowed: | fred can have no arguments, so no argument brackets are allowed: | ||
<vip> | <vip> | ||
_=thread::start(fred())</vip> | |||
</vip> | |||
is illegal. But the thread can access data prepared before it is started. | is illegal. But the thread can access data prepared before it is started. | ||
<vip> | |||
facts | <vip>facts | ||
zz_int:integer:=erroneous. | |||
clauses | clauses | ||
pred():- | |||
zz_int:=88, | |||
_=thread::start(fred). | |||
predicates | predicates | ||
fred:(). | |||
clauses | clauses | ||
fred():- | |||
K=zz_int, | |||
...</vip> | |||
</vip> |
Revision as of 20:34, 15 March 2009
This page contains a collection of basic examples for (mainly) the newer constructs found in VIP7.
Fact variables
Fact variables are the only mutable types in VIP.
Examples - "reminder- ordinary facts"
facts ndb_int:(integer). % a nondeterministic fact (0 to any number of values) db_int:(integer,string) determ. % a deterministic fact (0 to 1 value)
These types of fact are asserted and retracted.
Examples - "fact variables"
facts zz_int:integer:=0. zz_fred:integer:=erroneous. domains dom=dom(string,chaindb:ref). facts zz_dom:dom:=erroneous. clauses pred():- zz_int:=7, stdio::write("\n zz_int = ",zz_int), %will write "zz_int=7" zz_int:=zz_int+20, stdio::write("\n zz_int = ",zz_int), %will write "zz_int=27" succeed.
A fact variable is great for counting eg.
predicates pred:()=integer Count. clauses pred()=_:- zz_int:=0, some_nondeterm_fact_or_pred(), zz_int:=zz_int+1, fail. pred()=zz_int.
Lists - findall and list comprehension
See Lists and Recursion
findall() has been depricated, so use the list comprehension construct.
Examples
facts ndb:(integer). %default is nondeterm for a fact clauses ndb(1). ndb(2). ndb(3). .... ndb(10). clauses pred_old():- findall(X,ndb(X),List). %results in List = [1,2,3,4,5,6,7,8,9,10] clauses pred_new():- List=[X||ndb(X)]. %results in List = [1,2,3,4,5,6,7,8,9,10] clauses pred_filter():- List=[X||ndb(X), X>6]. %results in List = [7,8,9,10] pred_filter():- List=[X||ndb(X), X mod 2=0]. %results in List = [2,4,6,8,10] pred_filter():- List=[X||ndb(X), X mod 2=0, X<7]. %results in List = [2,4,6] pred_filter():- zz_int:=0, List=[X||ndb(X), X mod 2=0, X<7, zz_int:=zz_int+1]. %results in List = [2,4,6] and zz_int=3. pred_filter():- List=[X||ndb(X), Y=pred2(X), Y>10]. %with pred2(X)=X^2. %results in List = [4,5,6,7,8,9,10] %reason - X=3 gives Y=9 which is < 10. pred_other():- L=[1,2,3,4,5,6,7,8,9,10], LIST=[ X || X = list::getMember_nd(L)]. %results in List= L
if-then-else (code)
Examples
clauses pred(X):- if X>0 then stdio::write("\n X>0") %the last line in each block has no comma else stdio::write("\n X<=0") end if. pred(X):- if X>0 then stdio::write("\n X>0") elseif X = 0 then stdio::write("\n X=0") else stdio::write("\n X<0") end if. clauses pred(X,Y)=Z:- if X=0 then Z="x is zero" elseif X>0 then if pred3(Y)=true then Z="x>0 and pred(Y) is true" else Z="x>0 and pred(Y) is false" end if %note, no comma here either else Z="x <0" end if.
#if #then #else (directive for conditional compilation)
Examples
constants u64_con=1. int_con=2. real_con=3. compile_big_con=u64_con. %change this and then recompile. #if compile_big_con=u64_con #then predicates pred:()->unsigned64. clauses pred()=U64:- U64=78766. #elseif compile_big_con=int_con #then predicates pred:()->integer. clauses pred()=Int:- Int=20. #else predicates pred:(real [out]). clauses pred(0.766). #endif
Note
Code construct uses if - then, elseif - then, else, end if
compiler directive uses #if - #then, #elseif - #then, #else, #endif
(just the "end if" is "different")
Trap and try/catch/finally
See Try-catch-finally
Note, in
Built-in entities/Predicates
suggests using try-end try instead of trap(_,_,_)
Example 1
clauses pred_all():- try call_pred_that_might_crash(0) catch ErrorNo do call_own_exception_pred(ErrorNo) finally always_call_this_anyway() end try. class predicates call_pred_that_might_crash:(integer). call_own_exception_pred:(pointer ErrorNo). always_call_this_anyway:(). clauses call_pred_that_might_crash(X):- Y=9/X. call_own_exception_pred(ErrorNo):- vpiCommonDialogs::note("crashed"). always_call_this_anyway():- vpiCommonDialogs::note("finally reached").
Example 2
clauses pred_some():- try call_pred_that_might_crash(0) finally always_call_this_anyway() end try.
% in this case, VIP will automatically pop up its exception dialog
Example 3
clauses pred_some():- try call_pred_that_might_crash(0) catch ErrorNo do call_own_exception_pred(ErrorNo) end try.
Example 4 - illegal - it must have a catch or finally
clauses pred_illegal():- try call_pred_that_might_crash(0) end try.
64 bit numbers
Properties
Properties in a class are used almost identically to fact variables, but properties can be set directly (from another class), without having to declare a public predicate to make the change.
Example
interface fred domains complete_dom=is_complete; not_complete. properties prop_complete : complete_dom. end interface fred
In fred.pro:
facts zz_complete:complete_dom:=erroneous. clauses %for the property prop_complete()=zz_complete. %get prop_complete(COMPLETE):-zz_complete:=COMPLETE. %set
In some other class that calls class fred:
implement other open fred clauses pred():- Fred=fred::new(), Fred:prop_complete:=is_complete,% to set the value Value=Fred:prop_complete,!. %get
Comparators and compare
Anonymous predicates
(under development) See Anonymous_Predicates
Examples
clauses run() :- Anon={()=9}, K=Anon(). %results in K=9 run() :- Anon={=88}, K=Anon(). %results in K=88. run():- Anon={(A,B)=A+B}, K=Anon(4,8), %results in K=12. run():- Anon={ (A,B)=C:- R=math::random(7), C=A+B+R, stdio::wRite("RRRR=",R) }, K=Anon(4,8). %results in K=12 + a random number <7 run():- Anon={=f_abc(3)}, K=Anon(), stdio::write("\nI={=f_abc(3)} gives ",K), fail. run().
Threads
To start a thread:
clauses pred():- _=thread::start(fred). predicates fred:(). clauses fred():-.....
fred can have no arguments, so no argument brackets are allowed:
_=thread::start(fred())
is illegal. But the thread can access data prepared before it is started.
facts zz_int:integer:=erroneous. clauses pred():- zz_int:=88, _=thread::start(fred). predicates fred:(). clauses fred():- K=zz_int, ...