【问题标题】:Linear equation with one unknown using Prolog使用Prolog的具有一个未知数的线性方程
【发布时间】:2016-09-21 20:28:46
【问题描述】:

我想知道如何求解一个未知数的基本线性方程。

我尝试通过字符串拆分来获得解方程所需的一切,但我相信有更好的方法。

solve(5 + X = 10).
X = 5.
solve(5+8 = Ans).
Ans = 13.

这就是我要解决的问题。我想使用solve/1。

提前谢谢你。

【问题讨论】:

    标签: prolog clpfd constraint-programming


    【解决方案1】:

    你可以写:

    :- 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 知识。
    • 我只是尝试了最一般的查询,这对于了解更多关于 Prolog 谓词的信息总是一个好主意:?- solve(E). 问:“有 any 解决方案吗?”谓词 incorrectly 说:“不,没有。”
    • 回答false 意味着没有任何解决方案。因此,如果有解决方案,说false 是一个错误 的答案!在这种情况下,您必须抛出一个实例化错误来表明谓词不能给出更好的答案,如果你想以一种合乎逻辑的方式推理你的程序可能在全部。还有其他缺点。例如?- X+Y#=X. 推导出Y=0。你的第二个solve/1 没有。
    • 是的,这是由于nonvar/1!您应该添加var/1 测试并在参数没有充分实例化以给出正确答案时抛出实例化错误。否则,程序将不会按照我们对关系的预期运行。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多