【发布时间】:2012-04-03 02:15:33
【问题描述】:
我尝试使用 Prolog (SWI-Prolog) 检查学生数学表达式的正确性。因此,例如,如果要求学生添加三个变量 x、y 和 z,并且有一个规则,必须添加的前两个变量是:x 和 y(以任意顺序),最后一个必须添加的变量如果学生的答案是以下任何一个,那么我希望 prolog 能给我带来真正的价值:
x+y+z
(x+y)+z
z+(x+y)
z+x+y
y+x+z
还有许多其他的可能性。
我使用以下规则进行此检查:
addData :-
assert(variable(v1)),
assert(variable(v2)),
assert(variable(v3)),
assert(varName(v1,x)),
assert(varName(v2,y)),
assert(varName(v3,z)),
assert(varExpr(v1,x)),
assert(varExpr(v2,y)),
assert(varExpr(v3,z)).
add(A,B,R) :- R = A + B.
removeAll :- retractall(variable(X)),
retractall(varName(X,_)),
retractall(varExpr(X,_)).
checkExpr :-
% The first two variable must be x and y, in any combination
( (varExpr(v1,AExpr), varExpr(v2,BExpr));
(varExpr(v2,AExpr), varExpr(v1,BExpr))
),
add(AExpr, BExpr, R1),
% store the expression result as another variable, say v4
retractall(variable(v4)),
retractall(varName(v4, _)),
retractall(varExpr(v4, _)),
assert(variable(v4)),
assert(varName(v4, result)),
assert(varExpr(v4, R1)),
% add the result from prev addition with Z (in any combination)
( (varExpr(v3,CExpr), varExpr(v4,DExpr));
(varExpr(v4,CExpr), varExpr(v3,DExpr))
),
add(CExpr, DExpr, R2),
R2 = z + x + y. % will give me false
% R2 = z + (x + y). % will give me true
% Expected: both should give me true
checkCorrect :- removeAll,
addData,
checkExpr.
【问题讨论】:
标签: prolog