Переписать рекурсивную функцию пролога sicstus - PullRequest
1 голос
/ 14 сентября 2011

Моя цель - получить эти данные:

L = [a,b,c], build_tree(L,T).

С этим выводом:

L = [1,30,kth,5],
T = b(l(a),b(l(b),b(l(c)))) ? 

yes

И с этим кодом, который считает количество листьев в дереве:

leaves(l(X), [X]).
leaves(b(L1,L2),V):-
    leaves(L1,V1),
    leaves(L2,V2),
    append(V1,V2,V).

Я могу получить желаемый результат, просто предоставив функции список вместо дерева в качестве ввода, например:

L = [a,b,c], leaves(T,L).

Единственная проблема здесь в том, что он принимает аргументы в неправильном порядке (то есть build_tree (T, L) вместо build_tree (L, T)).

Итак, как я могу получить тот же результат, но просто поменять местами входные аргументы? Я пробовал каждое «очевидное» решение (обмениваясь переменными), но я предполагаю, что это может быть не так просто, как кажется, поскольку это рекурсивный метод.

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Также рассмотрите возможность использования DCG:

leaves(l(X))     --> [X].
leaves(b(T1,T2)) --> leaves(T1), leaves(T2).
1 голос
/ 15 сентября 2011

если у вас есть предикат и вы хотите изменить порядок аргументов, самый простой способ (imo) - написать предикат обертки:

my_foo(X,Y,Z):-
    foo(Y,Z,X).

foo(X,Y,Z):- ....
...