如何将用户输入转换为 gnu prolog 中的可重用谓词?
How to convert user input into a reusable predicate in gnu prolog?
给定一个子句
functionClause(Function):-...
和用户输入
?functionClause(or(and(r,q), not(p)))
,是否可以在程序中编写其他子句以获得对p,r,q的访问权限以便使用它,例如将真值放入p,r和q中并获取结果?
我想你可以这样做:
- 如果公式是一个原子命题,比如说
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.
给定一个子句
functionClause(Function):-...
和用户输入
?functionClause(or(and(r,q), not(p)))
,是否可以在程序中编写其他子句以获得对p,r,q的访问权限以便使用它,例如将真值放入p,r和q中并获取结果?
我想你可以这样做:
- 如果公式是一个原子命题,比如说
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.