我正在做功课需要实现两个关系和(A,B)和/或(A,B),它们对两个布尔操作数A和B执行逻辑“AND”和逻辑“OR”操作。如果A和B都评估为真,则(A,B)成立。如果A或B的计算结果为真,或者A和B都评估为真,则关系或(A,B)成立。 And-OR表达式可以嵌套,例如和(或(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.
当我运行简单和/或表达式时,它没问题。但是当我运行一些包含嵌套和/或表达式的表达式时,它只会给出“假”作为答案。如何更正代码以便它可以使用嵌套和/或表达式运行?
答案 0 :(得分: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?
这几乎与你所展示的一样:
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.
答案 1 :(得分:2)
当然,您需要完成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.