在Prolog中定义AND,OR,NOT运算符

时间:2018-06-05 19:45:30

标签: prolog

我必须定义一个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).

1 个答案:

答案 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),而Rand操作的结果。使用or等可以完成同样的工作。

您的声明:

:- op(100,xfy,and).

...允许编写X and Y而不是and(X,Y),但请注意这里没有第三个参数。对于ECLiPSe环境,运算符表示法也与is/2结合使用来评估算术表达式。由于上述add谓词处理数字,因此以下工作:

X is 0 and 1.

以上将X统一为0。