【发布时间】:2016-09-21 20:28:46
【问题描述】:
我想知道如何求解一个未知数的基本线性方程。
我尝试通过字符串拆分来获得解方程所需的一切,但我相信有更好的方法。
solve(5 + X = 10).
X = 5.
solve(5+8 = Ans).
Ans = 13.
这就是我要解决的问题。我想使用solve/1。
提前谢谢你。
【问题讨论】:
标签: prolog clpfd constraint-programming
我想知道如何求解一个未知数的基本线性方程。
我尝试通过字符串拆分来获得解方程所需的一切,但我相信有更好的方法。
solve(5 + X = 10).
X = 5.
solve(5+8 = Ans).
Ans = 13.
这就是我要解决的问题。我想使用solve/1。
提前谢谢你。
【问题讨论】:
标签: prolog clpfd constraint-programming
你可以写:
:- use_module(library(clpfd)).
solve(X+Y=Z):-X+Y#=Z.
一些例子:
?- solve(5+X=10).
X = 5.
?- solve(5+8=ANS).
ANS = 13.
要在没有库的情况下解决它,您可以编写:
solve(S):-var(S),throw("instatiation error").
solve(X+Y=Z):-(var(X),var(Y);var(X),var(Z);
var(Y),var(Z)),throw("instatiation error").
solve(X+Y=Z):-nonvar(Z),nonvar(Y),L is Z-Y,X=L.
solve(X+Y=Z):-nonvar(Z),nonvar(X),L is Z-X,Y=L.
solve(X+Y=Z):-nonvar(X),nonvar(Y),L is X+Y,Z=L.
又是例子:
?- solve(5+X=10).
X = 5 ;
false.
?- solve(5+8=Ans).
Ans = 13.
【讨论】:
?- solve(E). 说 false,尽管有解决方案。用低级代码替换约束求解器的功能并不容易。我建议避免它。相反,如果他们阻止您在 Prolog 课程中使用 Prolog,最好告诉讲师升级他们的 Prolog 知识。
?- solve(E). 问:“有 any 解决方案吗?”谓词 incorrectly 说:“不,没有。”
false 意味着没有任何解决方案。因此,如果有解决方案,说false 是一个错误 的答案!在这种情况下,您必须抛出一个实例化错误来表明谓词不能给出更好的答案,如果你想以一种合乎逻辑的方式推理你的程序可能在全部。还有其他缺点。例如?- X+Y#=X. 推导出Y=0。你的第二个solve/1 没有。
nonvar/1!您应该添加var/1 测试并在参数没有充分实例化以给出正确答案时抛出实例化错误。否则,程序将不会按照我们对关系的预期运行。