【问题标题】:Resolve quadratic equation in prolog在prolog中解决二次方程
【发布时间】:2014-10-20 20:59:37
【问题描述】:

我在 prolog 中遇到了二次方程实现的问题。 我知道一些基础知识,但同时我无法理解 swish.swi 控制台的输出。 如果您对我的错误提供任何帮助或建议,我将不胜感激。

delta(A, B, C, D):- D is B*B - 4*A*C.

equation(A,B,C,X):- D1<0,delta(A,B,C,D1),X is 0. % or false... but how to retur false there?
equation(A,B,C,X):- D1 =:= 0,delta(A,B,C,D1),X is -B/2*A. 
equation(A,B,C,X): D1>0,delta(A,B,C,D1),X is -B-sqrt(D1)/2*A.
equation(A,B,C,X): D1>0,delta(A,B,C,D1),X is -B+sqrt(D1)/2*A.

runnign equation(2, 0, 1, X). 后出现两个错误

Full stop in clause-body?  Cannot redefine ,/2
</2: Arguments are not sufficiently instantiated

【问题讨论】:

    标签: prolog instantiation-error


    【解决方案1】:

    在最后 2 个谓词(D>0 的谓词)中,您忘记在“:”之后写“-”。您的代码运行良好,这只是一个 sintax 错误。下面我为您更正了代码:

    delta(A, B, C, D):- D is B*B - 4*A*C.
    equation(A,B,C,X):- D1<0, delta(A,B,C,D1), X is 0. 
    equation(A,B,C,X):- D1 =:= 0, delta(A,B,C,D1), X is -B/2*A.
    equation(A,B,C,X):- delta(A,B,C,D1), D1>0, X is ((-1*B-sqrt(D1))/2*A).
    equation(A,B,C,X):- delta(A,B,C,D1), D1>0, X is ((-1*B+sqrt(D1))/2*A).
    

    【讨论】:

    • 谢谢,很久以前就问过了。
    【解决方案2】:

    关于

    参数没有充分实例化

    您必须交换 delta/4 和测试。另外,最好使用 if/then/else,以避免重新计算结果:

    equation(A,B,C,X) :-
     delta(A,B,C,D1),
     (  D1 < 0
     -> X is 0
     ;  D1 =:= 0
     -> X is -B/2*A
     ;  X is -B-sqrt(D1)/2*A
     ).
    

    【讨论】:

    • 非常感谢,我会考虑您的建议!
    • 但是当D1&lt;0 时,我们可以返回false 或类似于第一种情况的情况吗?是的,我们可以:) 我们必须这样做...( D1 &lt; 0 -&gt; !,fail ; ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多