Нетривиальный поиск и замена в Prolog

Таким образом, мы можем легко найти и заменить атом другим атомом в Прологе, выполнив что-то вроде:

replace([],A,B,[]).
replace([H|T],A,B,[B|Result]) :- 
    H=A, 
    replace(T,A,B,Result),!.
replace([H|T],A,B,[H|Result]) :- 
    replace(T,A,B,Result).

Я уверен, что есть и другие способы сделать это.

Однако я хочу сделать что-то более сложное. в логике вычислений. Как бы вы сделали что-то вроде замены конъюнкции типа конъюнкта (x, y) в логическом выражении только на (x, y)? Это похоже на final и replace, но не на атомы. Итак мы могли бы иметь что-то вроде reduce (con (con (x, y), z)). , которое я хотел бы сократить до ((x, y), z) .

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

Wh at Я не понимаю, как вы выполняете поиск и замену, когда входные данные на самом деле не являются списком; это структура. Я не понимаю, как вы можете решить эту проблему без использования стандартного [H | T] трюка с рекурсией и списками. У кого-нибудь есть идеи?

Большое спасибо.

6
задан false 25 January 2014 в 22:19
поделиться