2016-11-20 17 views
2

Хорошего дня,Пролог Tree Traversal

Я пытаюсь написать программу на Пролог, что данное дерево с функтором:

start(a(f,2,9), X). 

Я хочу, чтобы это квадрат любых значений внутри так, что она дает :

X = a(f,4,81). 

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

start([],[]). 
start(Tree, []) :- Tree =.. [P|C], write(P), nl, write(C), nl, squareMe([P|C], []). 
squareMe([X|T], [Y|Result]) :- % I think the problem is here 
    atom(X), 
    Y=X, 
    squareMe(T, Result). 
squareMe([X|T], [Y|Result]) :- 
    number(X), 
    Y is X * X, 
    squareMe(T, Result). 
squareMe([], []). 

когда код пишет P и C, я получаю правильные значения с помощью оператора UNIV, но это, кажется, терпит неудачу в squareMe.

Когда я вызываю squareMe ([P | C], []), мое понимание - это P = a и C = [f, 2, 9]. Итак, не должен ли атом (а) быть правдой? Кажется, это не так, и я не уверен, почему?

Я пробовал использовать trace/notrace для отслеживания моего пути, но было бы неплохо увидеть значения, которые были переданы в squareMe. Это возможно? Я использую SWI-Prolog.

ТИА, Coson

ответ

1

Это ответ вместо комментария только потому, что это слишком долго; Однако я не совсем понимаю ваш вопрос.

Чтобы получить решение на запрос вы показываете в верхней части, было бы достаточно, чтобы написать:

start(a(f, X, Y), a(f, XX, YY)) :- 
    XX is X*X, 
    YY is Y*Y. 

Вот оно:

?- start(a(f, 2, 9), X). 
X = a(f, 4, 81). 

Это слишком легко, и что более важно , Я не вижу здесь никакой древовидной структуры, поэтому я уверен, что не понимаю вопроса. У меня определенно есть проблемы с кодом, который вы показали. Вы должны изменить свой вопрос, чтобы объяснить:

  • где находится древовидная структура, в которой вы находитесь?
  • вы используете списки, плоские условия, вложенные условия
  • делает ваш предикат должен работать в обоих направлениях, поэтому вы должны быть в состоянии спросить (дерево): ?- start(X, Y)., например.