#prolog #logical-operators
Вопрос:
Учитывая оговорку
functionClause(Function):-...
и пользовательский ввод
?functionClause(or(and(r,q), not(p)))
,можно ли написать другие предложения внутри программы,чтобы получить доступ к p, r и q, чтобы использовать ее, например, для размещения значений истинности внутри p,r и q и получения результатов?
Ответ №1:
Я думаю, что вы можете сделать что-то вроде этого:
- Если формула является атомарным предложением, скажем
p
, замените ее соответствующей переменной, скажемA
, и соберите паруp = A
в список (только если переменнаяA
новая). - В противном случае, если формула является составным предложением, рекурсивно обработайте каждую подпозицию (накапливая используемые переменные).
% lifted( Formula, -Lifted, -Variables) lifted(Formula, Lifted, Variables) :- lifted(Formula, Lifted, [], Variables0), reverse(Variables0, Variables). lifted(F, V, Vs0, Vs) :- atom(F), !, % transform atom into a corresponding variable ( memberchk((F=V), Vs0) -gt; Vs = Vs0 % use existing variable ; Vs = [(F=V)|Vs0] % use new variable ). lifted(not(F), not(L), Vs0, Vs) :- lifted(F, L, Vs0, Vs). lifted(and(F1, F2), and(L1, L2), Vs0, Vs) :- lifted(F1, L1, Vs0, Vs1), lifted(F2, L2, Vs1, Vs). lifted(or(F1, F2), or(L1, L2), Vs0, Vs) :- lifted(F1, L1, Vs0, Vs1), lifted(F2, L2, Vs1, Vs). bool(_ = false). bool(_ = true ). interpretations(Formula) :- lifted(Formula, Lifted, Variables), forall( maplist(bool, Variables), format('~wn', [Lifted]) ).
Некоторые примеры:
?- lifted( and(p, or(not(p),q)), Lifted, Variables). Lifted = and(_A, or(not(_A), _B)), Variables = [p=_A, q=_B]. ?- interpretations( and(p, or(not(p),q)) ). and(false,or(not(false),false)) and(false,or(not(false),true)) and(true,or(not(true),false)) and(true,or(not(true),true)) true.