用prolog求解极其简单的方程:A=B+;C

用prolog求解极其简单的方程:A=B+;C,prolog,constraint-programming,clpfd,sicstus-prolog,swi-prolog,Prolog,Constraint Programming,Clpfd,Sicstus Prolog,Swi Prolog,我有一个非常简单的方程,我希望能够在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中求解:

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实现的范围,但我希望这个极其简单的方程是可处理的。

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

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

如果您的域是整数,使用

:- 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 ?-myEquation(A,B,C)。 B+C#=A,A在inf..sup中,B在inf..sup中,C在inf..sup中; 不 ?-myEquation(A,2,C)。 2+C#=A,A在inf..sup中,C在inf..sup中; 不 ?-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. % succeeds deterministically ?-myEquation(A,B,C)。 B+C#=A。 ?-myEquation(A,2,C)。 2+C#=A。 ?-myEquation(X,X,X)。 X=0.%决定性地成功
它并不超出大多数Prolog实现的范围。你只要读一点书就行了您看过CLP(约束逻辑编程)库了吗?请参阅/3感谢您的潜伏者和执行者。我在一个非常小的golang prolog环境中工作,CLP库有点重(虽然很棒!感谢指针)。查看plus/3的实现让我开始了竞争。您还可以通过检查给定的变量来编写谓词“long hand”(不带
plus/3
)。例如,如果
A
是整数,则
integer(A)
将为真。只需要几个子句或if-then-else构造就可以检查每个案例。您的第一个版本不正确
myEquation(0,0,0)
应该成功(可靠的消息来源告诉我),但您的版本失败。对
var(A)
等的测试大多容易出错。相反,只测试
非ar(X)
,并使用未选中的
(is)/2
作为最后一种情况。@zslevi:请删除不正确的版本,以便我们可以在有约束的情况下更新您的正确解@错误:现在修复它。不过我不认为var和nonvar之间有什么问题。您当前的解决方案也有一些可能,但需要付出额外的努力。此外,您还有很多不对称性:
myEquation(a,0+0,0)
产生一个实例化错误-它要么成功,要么产生一个类型错误。