我开始学习Prolog,我想要一个给定整数P
的程序给整数A
和B
,使得P = A² + B²
。如果没有满足这个方程的A
和B
值,false
应退还Prolog程序获取(整数)数字作为两个整数正方形的总和,为什么它不起作用?
例如:如果P = 5
,它应该给A = 1
和B = 2
(或A = 2
和B = 1
),因为1² + 2² = 5
。
我想这应该工作:
giveSum(P, A, B) :- integer(A), integer(B), integer(P), P is A*A + B*B.
与查询:
giveSum(5, A, B).
然而,事实并非如此。我该怎么办?我对Prolog很陌生,所以我仍然犯了很多错误。
在此先感谢!
非常感谢您的回复。 我有几个问题。如果你能回答他们,那将是非常棒的。 '非单调谓词'是什么意思,/ 1或/ 3是什么意思,以及label()函数做了什么? 在因特网上,我读了“为Vars中的每个变量赋值”,标签意味着系统地尝试使用有限域变量Vars的值,直到所有变量都被研磨为止。为函数标签(),但我不是很明白它。 也感谢您注意到不好的做法,我更改了名称,将来会使用下划线和声明式名称。 – Kevin
请为此单独提出问题。他们都值得自己讨论:1)单调性的定义和2)什么是“标签”?只有一个问题很简单,可以在评论中回答:'f/3'是一个**谓词指示符**,表示一个名为'f'的谓词,带有3 *个参数*。请注意,我们总是讨论**谓词**,它们比*函数*更普遍。伟大的名字!查找和使用对谓词**一般性**公平的好的陈述性名称是在Prolog中编程时非常重要的一个方面,也可能是其中较难的一个。 – mat