Page 1 of 1

Help a beginner in VIP!

Posted: 13 Jan 2016 14:24
by Jacques.Lauwerys
Hi,

I am learning VIP (Visual Prolog Environment 7.5 Commercial Edition) with the help of the book VisualPrologBeginners_7.2.pdf.
Reproducing the folowing example (Chapter 10 Recursion, list and sorting) :

Code: Select all

implement main     open core clauses     run() :-         console::init,        counter:: count(1),        _X=stdIO::readChar(). end implement main   goal     console::runUtf8(main::run).

Code: Select all

class counter     open core   predicates count : (integer Number) procedure.   end class counter

Code: Select all

implement counter     open core clauses count(Number) :-     Number<11,     stdIO::write(Number),     stdIO::nl,     NextNumber = Number+1,     count(NextNumber).   count(_) :-     stdIO :: write("C'est la fin !\n"), !. end implement counter
I have the following errors

Error message :
Type Action Description Filename Path
e631 The predicate 'counter::count/1 (i)', which is declared as 'procedure', is actually 'multi' Counter.pro

replacing "count(_)" with "count(11) in the second clause :
Type Action Description Filename Path
e631 The predicate 'counter::count/1 (i)', which is declared as 'procedure', is actually 'nondeterm' Counter.pro

I don't understand the reason why.

Thank you in advance for help.

Jacques

Posted: 13 Jan 2016 19:57
by B.Hooijenga
Hello Jacques,

This should be the correct code I think.

Code: Select all

implement main open core   clauses     run() :-         count(1),         _ = stdio::readChar().   class predicates     count : (integer Number) procedure.   clauses     count(Number) :-         Number < 11,         stdio::write(Number),         stdio::write("\n"),         NextNumber = Number+1,         count(NextNumber),         !.     count(_) :-         stdio::write("C'est la fin !\n"), !.   end implement main   goal     console::runUtf8(main::run).
Kind regards

Ben

Posted: 14 Jan 2016 8:16
by Jacques.Lauwerys
Hello Ben,

Sorry, I tried it, but it does not solve the problem. I received the same error messages.
On the other hand, ( I am not sure because I can't test) the cut you introduce in te count(Number) clause, should it not have the effect of not running the count clause (11), which is not the intention.

Jacques

Posted: 14 Jan 2016 11:06
by B.Hooijenga
Hello Jacques,


The cut has to be there for the following reason.

Without a cut predicate count()/1 has two possibilities:

Code: Select all

count(Number)
and

Code: Select all

count(_)
and is therefore multi.

With a cut the predicate count()/1 is a procedure which means there is only one solution.

If I may be so bold to make a remark:
In a recursive predicate the stop-condition is mostly written first. (with a cut!)

Your program looks then like this

Code: Select all

clauses      count(11) :-         stdIO :: write("C'est la fin !\n"),         !.      count(Number) :-         stdIO::write(Number, "\n"),         count( Number+1).        
Kind regards

Ben.

Posted: 14 Jan 2016 16:52
by Jacques.Lauwerys
Hello Ben,

Thank You so much for the suggestions.
For sure You may make remarks ! I am only learning to use the software.
In fact, both suggested solutions work !
I had made a mistake in trying to implement the first suggestion.

Again thank you for your advice.