2013-11-11 4 views
2

У меня довольно простая (я полагаю) проблема в Prolog (SWI-Prolog), но я не могу понять это.Prolog: Использование рекурсивного метода = ../2 (Univ)

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

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

Так что я хотел бы:

list_2_compound(List,Compound). 

который, например, работает как

list_2_compound([seq, [seq, [if, p1, p2], p2], p1, p3], Compound). 

Compound = seq(seq(if(p1, p2), p2), p1, p3) 

Так что я, как правило, требуется использовать = оператор ..:

Compound =.. [if, p1, p2] 
Compound = if(p1,p2) 

Но теперь в рекурсивный путь к вложенному списку.

+0

Это не невероятно сложно понять, но и не тривиально. Что вы пробовали? Вы придумали базовый корпус? –

+0

Хорошо, что базовый регистр будет list_2_compound (X, Y): - Y = .. X. Полагаю. Но у меня есть некоторые проблемы в рекурсивном случае, потому что у меня есть X как список, а Y как термин, я также не уверен, что базовый случай поэтому правильный. – patta1986

ответ

3

немного сложнее, чем я думал на первый взгляд.

list_2_compound(L, T) :- 
    var(T) 
    -> L = [F|Fs], maplist(list_2_compound, Fs, Ts), T =.. [F|Ts] 
    ; atomic(T) 
    -> L = T 
    ; L = [F|Fs], T =.. [F|Ts], maplist(list_2_compound, Fs, Ts). 
list_2_compound(T, T). 

(мое предыдущее сообщение произвело слишком много вложенного списка на обратном футляре). Испытание:

1 ?- list_2_compound([seq, [seq, [if, p1, p2], p2], p1, p3], Compound). 
Compound = seq(seq(if(p1, p2), p2), p1, p3) 
. 

2 ?- list_2_compound(S, $Compound). 
S = [seq, [seq, [if, p1, p2], p2], p1, p3] 
. 
+0

Спасибо! Это делает трансформацию. Я более подробно рассмотрю ваш ответ завтра, чтобы получить хорошее/полное понимание этого, чтобы я мог дать достойный ответ. – patta1986

+0

Я тестировал его в своем приложении, и он работает безупречно. Я добавил оператора сокращения в конце рекурсивного предложения таким образом, что получаю только первое объединение, которое именно то, что я хочу. – patta1986

+0

молодец, всегда лучше держать его детерминированным. Я забыл это... – CapelliC

Смежные вопросы