Пролог дедуктивного упражнения - PullRequest
0 голосов
/ 28 августа 2018

Я довольно застрял в этом упражнении:

Напишите предикат Пролога 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...