在序言中解决极其简单的方程:A = B + C?

yur*_*les 5 prolog constraint-programming

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

A = B + C

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

myEquation(A, B, C) :-
...something...
Run Code Online (Sandbox Code Playgroud)

我可以使用以下语义调用:

myEquation(A,1,2).
>    A = 3.
myEquation(3,B,2).
>    B = 1.
myEquation(3,1,C).
>    C = 2.
Run Code Online (Sandbox Code Playgroud)

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

zsl*_*evi 5

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

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.
Run Code Online (Sandbox Code Playgroud)

更新:与约束逻辑编程相同:

:- use_module(library(clpq)).

myEquation(A, B, C):-
    {A = B + C}.
Run Code Online (Sandbox Code Playgroud)

  • 你的第一个版本不正确。`myEquation(0,0,0)` 应该会成功(可靠消息来源告诉我),但是你的版本失败了。测试 `var(A)` 等很容易出错。相反,只测试 `nonvar(X)` 并使用未经检查的 `(is)/2` 作为最后一种情况。 (2认同)
  • 您当前的解决方案在某种程度上也是可能的,但需要额外的努力。此外,您有很多不对称性:`myEquation(A,0+0,0)` 会产生一个实例化错误——它要么成功,要么产生一个类型错误。 (2认同)