Prolog 序言:And或表达式(布尔函数)

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(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 = 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希望他们也能工作@是的,我忽略了这一点。