Я довольно застрял в этом упражнении:
Напишите предикат Пролога deduce(R, B, B1)
, который получает на входе список правил R
и список фактов B
, и который выводит новый список фактов B1
, полученных из B
путем применения все правила в R
, пока не достигнут фиксированной точки. Каждое правило R
выражается символом функции rule(Cs, D)
, где первый аргумент Cs
является списком условий, и если все они проверены, второй аргумент D
является истинным.
Например:
?- deduce([rule([p(X), q(X)], r(X))], [p(a), p(b), q(a)], B1).
X = a, B1 = [r(a), p(a), p(b), q(a)]
?- deduce([rule([p(X), q(X)], r(X)), rule([r(Y)], q(b))], [p(a), p(b), q(a)], B1).
X = Y, Y = a, B1 = [q(b), r(a), p(a), p(b), q(a)]
Я придумала это решение, чтобы проверить, достигает ли единственное правило фиксированной точки
deduce(rule([], _), B, B1) :-
append(B, [], B1).
deduce(rule([RH|RT], D), B, B1) :-
findall(RH, member(RH, B), Z),
deduce(rule(RT, D), B, B1).
и если выполнить его с первым примером, я получу следующий результат:
?- deduce(rule([p(X), q(X)], r(X)), [p(a), p(b), q(a)],B1).
B1 = [p(a), p(b), q(a)]
Теперь, как я могу проверить, что в B1
есть два разных правила, но с одним и тем же «аргументом» (т. Е. Проверка, которая существует p(a)
и q(a)
), и если есть, добавьте другое правило r(X)
, но с аргументом a
?