Создание списка деревьев выражений в Прологе - PullRequest
1 голос
/ 20 октября 2011

Давайте рассмотрим следующий код пролога, который позволяет мне формировать деревья выражений:

plus(_,_).

eval(A, A) :- number(A).
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.

Я могу легко определить и оценить деревья выражений следующим образом:

eval(plus(1,2), R).

, который оценивается как

R=3

Некоторые языки позволяют нам строить деревья выражений, а затем присваивать их переменной, чтобы их можно было потом использовать.В псевдокоде:

my_expr = plus(plus(1, 2), 3)

Мне интересно, смогу ли я с моим текущим представлением дерева достичь аналогичного результата?Я хотел бы иметь список с различным деревом выражений в каждом узле.Что-то вроде

[ plus(1, 2), plus(3,plus(2,1)), 3 ]

1 Ответ

1 голос
/ 20 октября 2011

Для вашего примера

my_expr = plus(plus(1, 2), 3)

Вы не можете сделать это, потому что левая и правая части = не совпадают.Если бы my_expr был переменной (в верхнем регистре), это было бы верно и заставило бы my_expr быть привязанным к дереву плюс (plus (1, 2), 3).Проверьте это -

?- My_expr = plus(plus(1, 2), 3), 
   eval(plus(My_expr, My_expr), Times2).

Times2 = 12

My_expr - совершенно законная структура, которую вы можете поместить в список или вызвать нижестоящее выражение с помощью.

...