我必须定义一个prolog程序,它为这样的逻辑公式提供真值表:
(a或非(b和c))
其中逻辑变量只能有true或false值,唯一的运算符是AND,OR和NOT。 该程序应该像这样:
table(a and (b or non a)).
[a, b]
[v, v] v
[v, f] f
[f, v] f
[f, f] f
yes
我所做的是定义3个运算符,但我不知道如何继续。你能救我吗?
:- op(30,fx,non).
:- op(100,xfy,or).
:- op(100,xfy,and).
答案 0 :(得分:1)
不是完整的解决方案,但这里有一些提示。
% fact: truth value "v" is satisfiable in all environments.
sat(v,_).
% rule: and(X,Y) is satisfiable in environment E iff both X and Y are sat in E
sat(and(X,Y),E) :- sat(X,E), sat(Y,E).
sat(Var, E) :-
(member(Var:Value,E) ->
Value = v
; throw(unknown_variable(Var,E))).
示例:
[eclipse 6]: sat(o,[o:v]).
Yes (0.00s cpu)
[eclipse 7]: sat(o,[o:f]).
No (0.00s cpu)
[eclipse 8]: sat(o,[u:v]).
uncaught exception in throw(unknown_variable(o, [u : v]))
Abort
定义一个规则(绑定),它将一个变量非确定性地绑定到一个值,另一个规则( bindings )将一个符号(原子)列表绑定到绑定列表。
% Two different solution possible when binding Var
binding(Var, Var:v).
binding(Var, Var:f).
% Lists of bindings
bindings([],[]).
bindings([V|VL],[B|BL]) :-
binding(V,B),
bindings(VL,BL).
例如:
[eclipse 9]: bindings([a,b,c],L).
L = [a : v, b : v, c : v]
Yes (0.00s cpu, solution 1, maybe more) ? ;
L = [a : v, b : v, c : f]
Yes (0.00s cpu, solution 2, maybe more) ? ;
L = [a : v, b : f, c : v]
Yes (0.00s cpu, solution 3, maybe more) ? ;
L = [a : v, b : f, c : f]
Yes (0.00s cpu, solution 4, maybe more) ? ;
L = [a : f, b : v, c : v]
Yes (0.00s cpu, solution 5, maybe more) ? ;
L = [a : f, b : v, c : f]
Yes (0.00s cpu, solution 6, maybe more) ? ;
L = [a : f, b : f, c : v]
Yes (0.00s cpu, solution 7, maybe more) ? ;
L = [a : f, b : f, c : f]
Yes (0.00s cpu, solution 8)
首先,您可以声明以下and
谓词:
and(0,0,0).
and(1,0,0).
and(0,1,0).
and(1,1,1).
该规则可以应用为and(X,Y,R)
,而R
是and
操作的结果。使用or
等可以完成同样的工作。
您的声明:
:- op(100,xfy,and).
...允许编写X and Y
而不是and(X,Y)
,但请注意这里没有第三个参数。对于ECLiPSe环境,运算符表示法也与is/2
结合使用来评估算术表达式。由于上述add
谓词处理数字,因此以下工作:
X is 0 and 1.
以上将X统一为0。