Как преобразовать пользовательский ввод в повторно используемый предикат в gnu prolog?

#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.