如何将用户输入转换为 gnu prolog 中的可重用谓词?

Posted

技术标签:

【中文标题】如何将用户输入转换为 gnu prolog 中的可重用谓词?【英文标题】:How to convert user input into a reusable predicate in gnu prolog? 【发布时间】:2021-12-31 04:43:13 【问题描述】:

给定一个子句

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) 
    ->  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('~w\n', [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.

【讨论】:

以上是关于如何将用户输入转换为 gnu prolog 中的可重用谓词?的主要内容,如果未能解决你的问题,请参考以下文章

GNU Prolog - 循环和新列表

Prolog DCG中的可选项或重复项

如何将prolog谓词转换为JSON?

Prolog:如何将字符串转换为整数?

无法使用 GNU-Emacs 在 SWI-Prolog 上编辑“Prolog 程序名称”(尝试设置劣质 Prolog 进程)

SWI Prolog与GNU Prolog - SWI下的CLP(FD)问题