2013-11-16 2 views
1

Я пытаюсь написать простую прологическую программу, которая должна заменить атом другим атомом. Программа может принимать комплексный функтор в качестве входного сигнала и заменяет все атомы другими атомами.Prolog: Заменить атом другим атомом в сложных терминах

например. В следующем выражении я хочу заменить атом а томом только там, где я сталкиваюсь с листом (т. Е. Не именем функтора).

replace(put(a,table,aside(a(dont,replace),a)),X). 

, который должен производить выход,

X = put(ax,table,aside(a(dont,replace),ax)); 
false. 

В приведенном выше выходе, заменял с топором всюду, за исключением имени функтора. В некотором смысле все листья заменяются. Но не внутренние узлы.

Я попытался следующим,

replace([],[]). 
replace([H | T], [H1 | T1]):- 
     (
     atom(H), (H == a) %If it's an atom and equal to a, then replace H1 with ax. 
     -> H1 = ax, replace(T, T1) %and recursively follow the same for T. 
     ; H1 = H, T1 = T, replace(T, T1) %else keep things as it is and recurse. 
     ). 
replace(L, R):- 
     functor(L, F1, A1), %if it's a functor then don't do anything, just follow 
     functor(R, F1, A1), %for the args of the functor. 
     L =.. [F1 | Args1], 
     R =.. [F1 | Args2], 

     replace(Args1, Args2),!. 

Задача 1. Я получаю неглубокий выход на тот же вход

replace(put(a,table,aside(ad,a,toe)),X). 
X = put(ax,table,aside(ad,a,toe)). 

ЗАДАЧА 2. Моего предикат провалится, когда арность изменений функторных. Например,

replace(put(a,table,aside(a(dont,replace),a)),X). 
Undefined predicate: substit/2 

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

Спасибо.

ответ

2

можно сделать в более общем смысле более простыми

replace(X,Y,X,Y) :- !. 
replace(X,Y,S,R) :- 
    S =.. [F|As], maplist(replace(X,Y),As,Rs), R =.. [F|Rs], !. 
replace(_,_,U,U). 

аналогичным образом, ваш код должен быть упрощен намного

replace([],[]). 
replace([H | T], [H1 | T1]):- 
     ( H == a 
     -> H1 = ax 
     ; replace(H, H1) 
     ), 
    replace(T, T1). 
replace(L, R):- 
     L =.. [F1 | Args1], 
     replace(Args1, Args2), 
     R =.. [F1 | Args2]. 

Теперь

?- replace(put(a,table,aside(a(dont,replace),a)),X). 
X = put(ax, table, aside(a(dont, replace), ax)) 

?- replace(put(a,table,aside(a(dont,replace),a)),X). 
X = put(ax, table, aside(a(dont, replace), ax)) 
Смежные вопросы