我是prolog编程的新手,我使用swi-prolog。现在我被一些数学问题所困扰
我们知道谓词:A is 3+3.
效果很好,答案是A=6
。
但如果我想从0~9找到两个数字(A和B),a + b = 6
6 is A+B
无效。所以我想知道是否有一个简单的方法来做到这一点?如果我想从0~9找到3位数(A,B和C)A + B + C = 13怎么做呢?
答案 0 :(得分:2)
更简单的方法,在每个Prolog实现中工作:声明一个谓词数字/ 1(符号谓词/ N表示谓词有N个参数)
digit(D) :- member(D, [0,1,2,3,4,5,6,7,8,9]).
然后你可以问
?- digit(A),digit(B),6 is A+B.
A = 0,
B = 6 ;
A = 1,
B = 5 ;
...
由于sum是对称的,您可能希望使用
减少重复的解决方案?- digit(A),digit(B),A=<B,6 is A+B.
使用库(clpfd)可以避免定义数字/ 1谓词,并获得很多功能:
?- [library(clpfd)].
true.
?- [A,B,C] ins 0..9, A+B+C #= 13, label([A,B,C]).
A = 0,
B = 4,
C = 9 ;
A = 0,
B = 5,
C = 8
...
请注意,现在,incognite可以保留在&#39;分配的左侧......
答案 1 :(得分:2)
我作为Prolog新手给你的建议是:
答案 2 :(得分:1)
用prolog做数学很有意思。 这看起来像是一项任务,我不想解决它,但我会尽力帮助你找到答案。 鉴于您的问题范围有限,您可以通过创建一个简单的prolog程序来定义从0到9的每个整数。 请记住,您还可以定义以下功能:
add3(A,B,C,SUM): - SUM是A + B + C。
您可以尝试通过公式解算器解决问题。 看到这个答案: Equation solver in SWI-Prolog
或使用约束逻辑编程。 http://www.swi-prolog.org/man/clpqr.html