在prolog中解决极其简单的等式:A = B + C?

时间:2014-10-14 20:24:48

标签: prolog constraint-programming

我有一个非常简单的等式,我希望能够在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实现的范围,但我希望这个非常简单的方程易于处理。

2 个答案:

答案 0 :(得分:4)

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

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}.

答案 1 :(得分:1)

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

:- 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 in inf..sup, B in inf..sup, C in inf..sup ? ;
no

?- myEquation(A,2,C).
2+C#=A, A in inf..sup, C in inf..sup ? ;
no    

?- myEquation(X,X,X).
X+X#=X, X in inf..sup ? ;
no

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

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

?- myEquation(A,2,C).
2+C#=A.

?- myEquation(X,X,X).
X = 0.                              % succeeds deterministically