Marco
Marco

Reputation: 50

Retrieve internal/canonical representation of terms in Prolog

I am writing a program for which I need terms in their prefix notation. The point is to being able to parse mathematical expressions to prefix notation, while preserving the correct order of Operations. I then want to save the result in the database for later use (using assert), which includes translating to another language, which uses prefix notation. Prolog Operators do all have a fixed priority which is a feature I want to use, as I will be using all sorts of operators (including clp operators).

As among others I need to include complete mathematical expressions, such as the equality operator. Thus I cannot recursively use the Univ operator (=..), because it won't accept equality operators etc. Or can I somehow use =.. ?

Essentially I want to work with the internal representation of

N is 3*4+5   % just a random example

which would be

is(N,+(*(3,4),5))

Now, I do know that I can use, write_canonical(N is 3*4+5) to get the internal representation as seen above.

So is there a way to somehow get the internal representation as a term or a list, or something. Would it be possible to bind the output of write_canonical to a variable?

I hope my question is clear enough.

Upvotes: 1

Views: 90

Answers (1)

Paulo Moura
Paulo Moura

Reputation: 18663

Prolog terms can be despicted as trees. But, when writing a term, the way a term is displayed depends on the defined operators and write options. Consider:

?- (N is 3*4+5) = is(N,+(*(3,4),5)).
true.

?- (N is 3*4+5) = is(Variable, Expression).
N = Variable,
Expression = 3*4+5.

?- 3*4+5 = +(*(3,4),5).
true.

I.e. operators are syntactic sugar. They don't change how terms are represented, only how terms are displayed.

Upvotes: 1

Related Questions