我是Prolog的新手.我需要编写一个整数加法器,将0-9之间的数字加到其他数字0-9,并产生0-18的解.这就是我想要做的:
% pseudo code
add(in1, in2, out) :-
in1 < 10,
in2 < 10,
out < 18.
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样称呼它:
要检查它是否是有效的添加:
?- add(1,2,3).
true.
?- add(1,2,4).
false.
Run Code Online (Sandbox Code Playgroud)
有一个缺失的变量:
?- add(X,2,3).
X = 1.
?- add(1,4,X).
X = 5.
Run Code Online (Sandbox Code Playgroud)
有多个缺失变量:
?- add(X,Y,Z).
% Some output that would make sense. Some examples could be:
X=1, Y=1, Z=2 ;
X=2, Y=1, Z=3 ......
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个相当简单的问题,它可能非常简单.但是,根据我正在使用的Prolog教程:
"与统一不同,算术比较运算符运算符不能用于为变量赋值.只有在每一个项的每个项都被实例化时才能进行计算."
所有现代Prolog系统都提供有限域约束,这些约束可以在所有方向上使用(与更低级别的算术谓词如is/2和>/2相反).在SWI-Prolog中:
:- use_module(library(clpfd)).
plus(X, Y, Z) :-
[X,Y] ins 0..9,
X + Y #= Z.
Run Code Online (Sandbox Code Playgroud)
您的示例的结果:
?- plus(1,2,3).
true.
?- plus(1,2,4).
false.
?- plus(X,2,3).
X = 1.
?- plus(1,4,X).
X = 5.
?- plus(X,Y,Z).
X in 0..9,
X+Y#=Z,
Y in 0..9,
Z in 0..18.
Run Code Online (Sandbox Code Playgroud)
由于谓词可以在所有方向上使用,因此将其称为"add/3"不再有意义,因为这意味着方向,但谓词真实地描述了关系何时成立并因此更加通用.
解决方案:
lessThanTen(9).
lessThanTen(8).
lessThanTen(7).
lessThanTen(6).
lessThanTen(5).
lessThanTen(4).
lessThanTen(3).
lessThanTen(2).
lessThanTen(1).
lessThanTen(0).
addSimple(Add1,Add2,Sol) :-
lessThanTen(Add1),
lessThanTen(Add2),
Sol is Add1+Add2.
Run Code Online (Sandbox Code Playgroud)