序言如何使用数学运算

prolog how to use math operation

我是prolog编程的新手,我使用swi-prolog。现在我被一些数学问题困住了

我们知道谓词 :A is 3+3. 工作得很好,答案是 A=6

但是如果我想从0~9中找到两个数字(A和B)那a+b=6 6 is A+B 不起作用。所以我想知道是否有简单的方法可以做到这一点?如果我想从 0~9 中找到 A+B+C=13 的 3 个数字(A、B 和 C)怎么办?

更简单的方法,在每个 Prolog 实现中工作:声明一个谓词 digit/1(符号 predicate/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 ;
...

因为总和是对称的,也许您想减少重复的解决方案

?- digit(A),digit(B),A=<B,6 is A+B.

使用库 (clpfd) 可以避免定义 digit/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 
...

请注意,现在隐姓埋名者可以留在 'assignment'...

的左侧

用序言做数学很有趣。 这看起来像是一项任务,我不想解决它,但我会尽力帮助您自己找到答案。 鉴于您的问题范围有限,您可能可以通过创建一个简单的序言程序来定义从 0 到 9 的每个整数。 请记住,您还可以定义以下函数:

add3(A, B, C,SUM) :- SUM is A + B + C.

你可以尝试用方程求解器来解决这个问题。 看到这个答案: Equation solver in SWI-Prolog

或者使用约束逻辑编程。 http://www.swi-prolog.org/man/clpqr.html

作为 Prolog 新手,我给你的建议是:

  1. 要事第一!

  2. 使用 clpfd!您可以立即阅读标签[=14=上的标签信息部分] ].

  3. 养成使用以下行开始扩展名为 .pl 的新文件的习惯:

    :- use_module(library(clpfd)).
  4. 每次使用 clpfd 你想表达整数上的 Prolog 关系:Every。单身的。时间.

  5. 见证 clpfd 已经广泛使用并且仍在取得进展

  6. 意识到如果您先学习,您将获益最多——而不是 1970 年代的风格(is)/2!

    为什么? (is)/2 是一个 低级功能 最适合约束求解器实现者使用。