Учитывая подстановку S и список Xs, как применить S к Xs - PullRequest
3 голосов
/ 06 июня 2011

Предположим, у меня есть подстановка S и список Xs , где каждая переменная в Xs также встречается в S . Как найти список S (Xs) , т.е. список, полученный путем применения подстановки S к списку Xs .

Более конкретно, у меня есть набор предикатов и правил DCG, которые выглядят примерно так:

pat(P)   --> seg(_), P, seg(_).
seg(X,Y,Z) :- append(X,Z,Y).

Если я попытаюсь сопоставить шаблон P с переменными в списке, я получу подстановку S :

?- pat([a,X,b,Y],[d,a,c,b,e,d],[]).
   X = c,
   Y = e

Я хочу применить подстановку S = {X = c, Y = e} к списку Xs с переменными X и Y и получите список с выполненными заменами, но я не уверен, что лучший способ решить эту проблему.

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

1 Ответ

1 голос
/ 06 июня 2011

Поскольку подстановка не выполняется (не является объектом Prolog), вы можете связать список с переменной и позволить объединению выполнять свою работу:

?- Xs = [a,X,b,Y], pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e .

Редактировать : Если вы хотите сохранить исходный список после замены, используйте copy_term:

?- Xs = [a,X,b,Y], copy_term(Xs,Ys), pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e,
Ys = [a, _G118, b, _G124] .
...