Anton Poznyak
Anton Poznyak

Reputation: 3

Prolog. Error occurs in the compilation of "if-else"

I have a small problem - I did not get to write "if - else." Need to check on the long side if it is a triangle or not. Here is my code, but the compiler indicates an error in the comparison sign "<" in "A < B + C" - "E;Test_Goal, pos: 465, 406 ')' or ',' expected" I would be very grateful for the help.

PREDICATES
equal(integer,integer,integer)
isTriangle(integer,integer,integer)

CLAUSES 

/*isTriangle(A,B,C):-
    ( A < B + C ->
        ( B < A + C ->
            ( C < A + B ->
                writeln("It is triangle"),
                fail
            ;   C >= A + B ->
                write("It is not triangle!")
            )
            fail
        ;   B >= A + C ->
            write("It is not triangle!")
        )
        fail
    ;   A >= B + C ->
        write("It is not triangle!")
    )*/

isTriangle(A,B,C):-
    ( (A < B + C; B < A + C; C < A + B) -> writeln("It is triangle")
    ; (A >= B + C; B >= A + C; C >= A + B) -> write("It is not triangle!")
    )

equal(A,B,C):-  
    isTriangle(A,B,C),
    A = B,
    B = C,
    C = A.

GOAL
equal(3,0,3).

Upvotes: 0

Views: 411

Answers (1)

lurker
lurker

Reputation: 58244

I don't believe Visual Prolog supports the ISO Prolog operator, ->/2. You can try refactoring your predicate from this:

isTriangle(A,B,C):-
    ( (A < B + C; B < A + C; C < A + B) -> writeln("It is triangle")
    ; (A >= B + C; B >= A + C; C >= A + B) -> write("It is not triangle!")
    )

To this:

isTriangle(A, B, C):-
    (A < B + C; B < A + C; C < A + B),
    write("It is not triangle!").
isTriangle(A, B, C):-
    (A >= B + C; B >= A + C; C >= A + B),
    write("It is not triangle!").

But isn't it true that, for any triangle ABC that all of the inequalities must hold? So it really should be:

isTriangle(A, B, C):-
    A < B + C,
    B < A + C,
    C < A + B,
    write("It is not triangle!").
isTriangle(A, B, C):-
    (A >= B + C; B >= A + C; C >= A + B),
    write("It is not triangle!").

Alternatively, you could use a cut. I prefer the above approach to using a cut, but in case Visual Prolog (which deviates from standard Prolog in many ways) doesn't like parenthetical statement groupings:

isTriangle(A, B, C):-
    A < B + C,
    B < A + C,
    C < A + B, !,
    write("It is not triangle!").
isTriangle(A, B, C):-
    write("It is not triangle!").

Upvotes: 1

Related Questions