【问题标题】:Solve extremely simple equation in prolog: A = B + C?在 prolog 中求解极其简单的方程:A = B + C?
【发布时间】:2014-10-14 20:24:47
【问题描述】:

我有一个非常简单的方程,我希望能够在 prolog 中求解:

A = B + C

我希望能够编写一个表达这种关系的谓词,它可以处理任何一个未实例化的参数。无需推广到更复杂的关系或方程。

myEquation(A, B, C) :-
...something...

我可以用以下语义调用:

myEquation(A,1,2).
>    A = 3.
myEquation(3,B,2).
>    B = 1.
myEquation(3,1,C).
>    C = 2.

有什么想法吗?使用算术运算符会产生很多“参数没有充分实例化”的错误。看起来求解任意方程组超出了大多数 prolog 实现的范围,但我希望这个极其简单的方程易于处理。

【问题讨论】:

  • 这并不超出大多数 Prolog 实现的范围。你只需要做一点阅读。 ;) 你看过 CLP(约束逻辑编程)库吗?
  • plus/3
  • 谢谢 lurker 和 CapelliC。我在一个非常小的 golang prolog 环境中工作,并且 CLP 库有点重(虽然很棒!感谢指针)。看看 plus/3 的实现让我开始了比赛。
  • 你也可以通过检查给定的变量来编写你的谓词“长手”(没有plus/3)。例如,如果A 是整数,则integer(A) 将为真。只需要几个子句或一个 if-then-else 结构来检查每个案例。

标签: prolog constraint-programming


【解决方案1】:

不是特别花哨,但就是这样。如果您不是绝对的初学者,您也可以这样做:

myEquation(A, B, C):- 
    var(A),number(B),number(C) -> A is B+C;
    var(B),number(A),number(C) -> B is A-C;
    var(C),number(A),number(B) -> C is A-B;
    A =:= B + C.

更新: 约束逻辑编程也是如此:

:- use_module(library(clpq)).

myEquation(A, B, C):-
    {A = B + C}.

【讨论】:

  • 您的第一个版本不正确。 myEquation(0,0,0) 应该成功(可靠消息来源告诉我),但您的版本失败。对var(A) 等的测试大多容易出错。相反,只测试nonvar(X) 并使用未选中的(is)/2 作为最后一种情况。
  • @zslevi:请删除不正确的版本,以便我们可以对您的正确解决方案进行投票!
  • @false :现在修复它。不过,我没有看到 var 与 nonvar 的问题。
  • 您当前的解决方案在某种程度上也是可能的,但需要付出相当多的努力。此外,你有很多不对称:myEquation(A,0+0,0) 产生一个实例化错误 - 它应该成功,或者产生一个类型错误。
【解决方案2】:

如果您的域是整数,使用!

:- use_module(library(clpfd)).

:- assert(clpfd:full_answer).       % for SICStus Prolog

myEquation(A,B,C) :-
   A #= B+C.

的一些示例查询,版本 4.3.2:

?- myEquation(A,B,C)。 B+C#=A,A 在 inf..sup 中,B 在 inf..sup 中,C 在 inf..sup 中? ; 不 ?- myEquation(A,2,C)。 2+C#=A,inf..sup 中的 A,inf..sup 中的 C? ; 不 ?- myEquation(X,X,X)。 X+X#=X, X inf..sup ? ; 没有

让我们使用 7.3.3 版运行相同的查询:

?- myEquation(A,B,C)。 B+C#=A。 ?- myEquation(A,2,C)。 2+C#=A。 ?- myEquation(X,X,X)。 X = 0. % 确定性成功

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2022-07-20
    • 2021-10-04
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多