用prolog求解极其简单的方程:A=B+;C
我有一个非常简单的方程,我希望能够在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. 有什么想法吗
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)
产生一个实例化错误-它要么成功,要么产生一个类型错误。