Вдохновленный an earlier question Я попытался реализовать что-то, что бы перечислить возможности для булевого выражения. Однако у меня возникают проблемы с выбором переменных. Вот мой ожидаемый результат:Управление выбором значения переменной Prolog
?- eval(X^Y, R).
R = 0^0;
R = 0^1;
R = 1^0;
R = 1^1;
no.
Вот мой код:
:- op(200, yfx, ^).
split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(X^Y, XP^YP) :- split(X, XP), split(Y, YP).
Это уже не делать то, что я хочу, даже для этого простого случая:
?- split(Y, R).
R = 0 ;
R = 1 ;
Y = _G269^_G270,
R = 0^0 ;
Y = _G269^_G270,
R = 0^1 ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^0) ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^1) ;
Y = _G269^ (_G275^ (_G281^_G282)),
R = 0^ (0^ (0^0)) .
Итак, я могу видеть проблема в том, что на пути через split(Y, YP)
Пролог исчерпал первые два предложения, так что он снова заканчивается в split(X^Y, ...)
, объединяя мой Y
с X'^Y'
, по существу. Я просто не уверен, что мне нужно сделать, чтобы закрыть этот путь, за исключением того, что у меня есть структура ^/2
.
Мне также хотелось бы, чтобы это работало с вложенными структурами, поэтому я не могу просто исключить рекурсивную обработку ветвей.
Редактировать: без операторов
Если op/3
беспокоит Вас, рассмотреть эту формулировку:
eval(and(X,Y), R).
R = and(0,0);
R = and(0,1);
R = and(1,0);
R = and(1,1);
no.
Это будет код в этом случае:
split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(and(X,Y), and(XP,YP)) :- split(X, XP), split(Y, YP).
Медведь в я бы все еще хотел, чтобы он работал с рекурсивными формулировками, такими как and(and(X,Y),and(Y,Z))
и т. д.
Ссылка на предыдущий вопрос не работает. –
@GuyCoder Когда вы получите еще 1000 реп, этого не будет. :) –
@GuyCoder вам не нужно будет отвечать на мой вопрос –