Prolog 序言:And或表达式(布尔函数)
我正在做一个家庭作业,需要实现两个关系and(a,B)和or(a,B),它们对两个布尔操作数a和B执行逻辑“and”和逻辑“or”运算。如果a和B的计算结果都为真,则关系and(a,B)成立。如果A或B的计算结果为真,或者A和B的计算结果均为真,则关系or(A,B)成立。And或表达式可以嵌套,例如And(或(A,B)和(C,D)) 一些示例输入和输出:Prolog 序言:And或表达式(布尔函数),prolog,Prolog,我正在做一个家庭作业,需要实现两个关系and(a,B)和or(a,B),它们对两个布尔操作数a和B执行逻辑“and”和逻辑“or”运算。如果a和B的计算结果都为真,则关系and(a,B)成立。如果A或B的计算结果为真,或者A和B的计算结果均为真,则关系or(A,B)成立。And或表达式可以嵌套,例如And(或(A,B)和(C,D)) 一些示例输入和输出: ?- and(true,false). false. ?- or(true,false). true. ?- and(A,true). A =
?- and(true,false).
false.
?- or(true,false).
true.
?- and(A,true).
A = true ;
false.
?- or(A,B).
A = true ;
B = true ;
false.
?- and(or(A,B),and(C,D)).
A = true,
C = true,
D = true ;
B = true,
C = true,
D = true ;
false.
?- or( and(or(A,B),C), or(and(D,E),or(F,G)) ).
A = true,
C = true ;
B = true,
C = true ;
D = true,
E = true ;
F = true ;
G = true ;
false.
我的代码:
and(true,true).
and(false,_):-false.
and(_,false):-false.
or(true,_).
or(_,true).
or(false,false):-false.
当我运行简单的and或or表达式时,一切正常。但是当我运行一些包含嵌套and或or表达式的表达式时,它只给出“false”作为答案。如何更正代码,使其能够使用嵌套的and或or表达式运行?当然,您需要完成对DSL(域特定语言)语法树的访问,或者让Prolog利用这些基本规则:可以像
and(L,R) :- L,R.
or(L,R) :- L;R.
这就产生了
1 ?- and(true,or(false,true)).
true.
2 ?- and(true,or(false,false)).
false.
如果您想自己做,这样它也能以生成的方式工作(不像Capelical的回答中所看到的“裸”序言代码),那么:
和(A,B):-is_-true(A),is_-true(B)。
或(A,B):-是真的(A);是真的吗。
是真的(真的)。%//不需要包含任何带有false的案例,它无论如何都会失败
是真的吗(A):-var(A)!,错误。%//防止它产生过多的东西
是真的(和(A,B)):-和(A,B)。
是真的(或(A,B)):-…%/你能猜到这里写什么吗?
这几乎完全如您所示:
<代码>14?-和(对,错)。
错。
15?-或(对,错)。
正确;%//额外的选择点
错。
16?-和(A,正确)。%//也以生成的方式工作
A=真;
错。
17?-或(A,B)。
A=真;
B=正确;
错。
18?-和(或(A,B)和(C,D))。
A=C,C=D,D=true;
B=C,C=D,D=true;
错。
19?-或(和(或(A,B),C),或(和(D,E),或(F,G)))。
A=C,C=true;
B=C,C=true;
D=E,E=true;
F=真;
G=真;
错。
但对于非基础术语,如
和(A,true)而言,此操作失败。
等;OP希望他们也能工作@是的,我忽略了这一点。