我是prolog编程的新手,我使用swi.现在我被一些数学题缠住了
正如我们所知道的,谓词: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是如何做到的呢?
发布于 2015-10-09 12:50:24
在每个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
...请注意,现在匿名者可以留在‘任务’的左边.
发布于 2015-10-09 13:00:16
用prolog做数学很有趣。这看起来像一个任务,我不想解决它,但我会尽力帮助你自己找到答案。考虑到问题的范围有限,您可能可以通过创建一个简单的prolog程序从0到9定义每个整数。请记住,您还可以定义如下功能:
add3(A,B,C,SUM) :- SUM是A+B+ C。
你可以用方程求解器来解决这个问题。见以下答案:SWI中的方程求解器
或者使用约束逻辑编程。http://www.swi-prolog.org/man/clpqr.html
https://stackoverflow.com/questions/33038577
复制相似问题