Prolog:And-Or表达式(布尔函数)

Pet*_*ter 6 prolog

我正在做一个作业,需要实现两个关系and(A,B)和or(A,B),它们对两个布尔操作数A和B执行逻辑“ AND”和逻辑“ OR”运算。 B)判断A和B是否都为true。如果A或B的评估结果为true,或者A和B的评估结果均为true,则关系or(A,B)成立。And-OR表达式可以嵌套,例如and(or(A,B),and(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.
Run Code Online (Sandbox Code Playgroud)

我的代码:

and(true,true).
and(false,_):-false.
and(_,false):-false.
or(true,_).
or(_,true).
or(false,false):-false.
Run Code Online (Sandbox Code Playgroud)

当我运行简单的and-or表达式时,就可以了。但是,当我运行一些包含嵌套和-或表达式的表达式时,它只是给出“ false”作为答案。我该如何纠正代码,使其可以与嵌套和-或表达式一起运行?

Wil*_*ess 5

如果您想自己进行操作,以使其也以生成方式工作(与CapelliC答案中所见的“裸” Prolog代码不同),则:

and(A,B):- is_true(A), is_true(B).
or(A,B):- is_true(A) ; is_true(B).

is_true(true).      %// no need to include any cases with false, it'll fail anyway
is_true(A):- var(A), !, false.  %// prevent it from generating too much stuff
is_true(and(A,B)):- and(A,B).
is_true(or(A,B)):- ... .        %// can you guess what to write here?
Run Code Online (Sandbox Code Playgroud)

这几乎与您显示的完全一样:

14 ?- and(true,false).
false.

15 ?- or(true,false).
true ;                     %// an extra choice point
false.

16 ?- and(A,true).         %// works in generative fashion as well
A = true ;
false.

17 ?- or(A,B).
A = true ;
B = true ;
false.

18 ?- and(or(A,B),and(C,D)).
A = C, C = D, D = true ;
B = C, C = D, D = true ;
false.

19 ?- or( and(or(A,B),C), or(and(D,E),or(F,G)) ).
A = C, C = true ;
B = C, C = true ;
D = E, E = true ;
F = true ;
G = true ;
false.
Run Code Online (Sandbox Code Playgroud)