## What does this code do?

Discussions related to Visual Prolog
Klim0
Posts: 1
Joined: 1 May 2020 22:00

### What does this code do?

Hey guys,

circuit(b,a).
circuit(a,b).
circuit(c,b).
circuit(a,c).

path([]).
path([_]).
path[X,Y|Zs]):- circuit(X,Y), path([Y|Zs]).
path(X,Y).

What does this program do and how does it work? Please, help :/

Martin Meyer
VIP Member
Posts: 279
Joined: 14 Nov 2002 0:01

### Re: What does this code do?

Hi Klim (and Thomas),

the short answer is: Your code throws a syntax error in Visual Prolog (build 904) and does not work at all.

More in detail, I have tried to fit the code into VIP's syntax (which differs from 'standard' Prolog) and let it do a computation which makes sense in somehow. To test my/your code create a new console application project and replace the contents of main.pro by:

Code: Select all

``````implement main

domains
smbl = a; b; c.

class predicates
smbl_nd : (smbl X) nondeterm anyflow.
clauses
smbl_nd(a).

smbl_nd(b).

smbl_nd(c).

class predicates
circuit : (smbl X, smbl Y) nondeterm anyflow.
clauses
circuit(b, a).

circuit(a, b).

circuit(c, b).

circuit(a, c).

class predicates
path : (smbl* Path) multi (o) nondeterm ([i|o]).
clauses
path([]).

path([X]) :-
smbl_nd(X).

path([X, Y | Zs]) :-
circuit(X, Y),
path([Y | Zs]).

path([X, Y]) :-
smbl_nd(X),
smbl_nd(Y).

clauses
run() :-
foreach path(Path) do
stdIO::write("Path ", Path, " is a solution"),
end foreach.

end implement main

goal
console::runUtf8(main::run).``````
Execute it (in 32bit mode) by typing Alt+F5. Each time when you hit Return, it computes a new solution. I.e. it computes another path which matches the constraints you have stated in the clauses of predicates path/1 and circuit/2. Abort the loop with Ctrl+C.

In 64bit mode however the code runs on an exception. Please, Thomas, have a look at that.
Regards Martin

Thomas Linder Puls
VIP Member
Posts: 1168
Joined: 28 Feb 2000 0:01

### Re: What does this code do?

Thank you Martin, we will look at it.
Regards Thomas Linder Puls
PDC

Thomas Linder Puls
VIP Member
Posts: 1168
Joined: 28 Feb 2000 0:01

### Re: What does this code do?

Hi Klim.

As Martin explains the program is a "traditional Prolog program, not a Visual Prolog program.

Besides that the program validates path's in a little circuit(/graph). The last clause is however must have to do with something different.

The circuit predicate defines the circuit, in terms of the direct connections (edges) between some nodes (vertices). The first clause says that there is a connection from a to b, the second clause says there is a connection from b to a (so connections must be directed/one way), and so forth.

path takes (or gives) a list of nodes and determines (ensures) that those nodes constitute a path you can follow in the circuit. [a, b, a] is such a path because starting at a you can go b and from b you can go back to a.

The first clause in path says that the empty path is a path in the circuit.

The second clause says that if you are at a node and don't move then it is a path in the circuit.

The third clauses says that if you have a path starting in some node X and with Y as next node and some additional steps Zs. Then this path is a valid path, if there is a direct connection from X to Y, and furthermore that the path starting in Y and continuing with the steps Zs is also a valid path.

The in last clause path have two arguments, so even though it is called path it is actually another predicate. My guess is that it should just be deleted. And in any case it doesn't have any influence on the rest of the program.

For further understanding and learning Visual Prolog (and thereby to to some extend "traditional" Prolog) I suggest that you download Visual Prolog read the tutorials.
Regards Thomas Linder Puls
PDC