syntax - Use of conditionals in Prolog -
i confused how conditionals used in prolog. while example 1 case conditional, example 2 shows case says newpos = exit on other side of -> operator. checking if newpos equal exit or case value exit being assigned newpos? shouldn't is used assign values in prolog?
sorry if basic syntax question.
example 1
current = b(_,cost,newpos), ( exit=none -> backtrack_path(current,visited,rpath) ; exit=b(5,5) -> backtrack_path(current,visited,rpath) example 2
current = b(_,cost,newpos), ( exit=none -> backtrack_path(current,visited,rpath) ; otherwise -> newpos = exit, backtrack_path(current,visited,rpath)
for more detailed @ prolog -> operator, see what's meaning of prolog operator '->'. examples covered below.
example 1:
current = b(_,cost,newpos), unifies current term, b(_, cost, newpos). unficiation in prolog not same assignment. in unification, prolog attempt match 2 arguments of =/2 possibly instantiating variables on either side achieve unification. if, example, current, cost , newpos uninstantiated, current instantiated b(_, cost, newpos) (using same variables, cost , newpos. if, later on, cost instantiated with, say, 10, current become, b(_, 10, newpos), in effect.
( exit=none -> backtrack_path(current,visited,rpath) ; exit=b(5,5) -> backtrack_path(current,visited,rpath) ; has lower precedence ->, is, in effect:
( exit=none -> backtrack_path(current,visited,rpath) ; ( exit=b(5,5) -> backtrack_path(current,visited,rpath), ... ), ... ) exit = none attempt unify exit , atom, none. succeed if exit uninstantiated (and instantiate exit none), or can succeed if exit instantiated none. fail if exit instantiated term doesn't match none.
if exit = none succeeds, first backtrack_path(current, visited, rpath) called. if fails, attempt made unify exit b(5,5). if prior exit = none failed, got point because exit unified didn't match none, , succeed exit = b(5,5) if unified term looks like, b(x, y). otherwise, fail. if succeeds, then, again, backtrack_path(current, visited, rpath) called.
example 2:
current = b(_,cost,newpos), ( exit=none -> backtrack_path(current,visited,rpath) ; otherwise -> newpos = exit, backtrack_path(current,visited,rpath) , has highest precedence, followed ->, followed ;. effectively:
current = b(_,cost,newpos), ( exit=none -> backtrack_path(current,visited,rpath) ; ( otherwise -> ( newpos = exit, backtrack_path(current,visited,rpath), ... ), ... ), ... ) see discussion above unification. if exit = none succeeds, backtrack_path(current, visited, rpath) called. otherwise, then otherwise call done (note if otherwise block of code, operator precedence can affect grouping show above, i'm assuming otherwise block has precedence on following ->).
if otherwise succeeds, prolog attempts newpos = exit, , if succeeds, move on call, backtrack_path(current, visited, rpath). if newpos = exit unification fails, then, in case, lacking "else" or "or" (;) type of expression, might backtrack way current = b(_, cost, newpos). backtracks depends upon other code have in clause (it's bit hypothetically presented, anything).
regarding is/2
is/2 used (a) evaluate numeric expression second argument, , (b) unify result of expression evaluation first argument. here examples, showing contrast =/2 (unification):
| ?- x = + b. x = a+b yes here, x unified term, a + b. x instantiated term a+b (which term, '+'(a, b))
| ?- = 2, b = 3, x = + b. = 2 b = 3 x = 2+3 yes x unified term, a + b. a unified 2 (and a instantiated value 2), , b unified 3. x unified 2+3 (or `'+'(2,3)).
| ?- = 2, b = 3, x + b. = 2 b = 3 x = 5 yes the expression on right hand side of is (the second argument is/2) evaluated yielding 5. x instantiated 5.
| ?- = 2, x + b. uncaught exception: error(instantiation_error,(is)/2) b isn't instantiated, expression, a + b cannot evaluated, is/2 fails due instantiation error.
| ?- = 2, b = 3, z = 5, z + b. = 2 b = 3 z = 5 yes a, b, , z instantiated numeric values, , z + b succeeds since a + b evaluates 5, unifiable z has value 5.
| ?- = 2, b = 3, z = 4, z + b. no a, b, , z instantiated numeric values, , z + b fails since a + b evaluates 5, not unifiable z has value 4.
| ?- = 2, b = 3, x = + b, z x. = 2 b = 3 x = 2+3 z = 5 yes x unified term, a + b, term 2 + 3 since a has been instantiated 2, , b 3. z unified evaluation of expression x (which 2 + 3) , has value 5.
Comments
Post a Comment