我有一个非常简单的等式,我希望能够在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实现的范围,但我希望这个非常简单的方程易于处理。
答案 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)
如果您的域名是整数,使用clpfd!
:- use_module(library(clpfd)).
:- assert(clpfd:full_answer). % for SICStus Prolog
myEquation(A,B,C) :-
A #= B+C.
sicstus-prolog版本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
让我们使用swi-prolog版本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