[英]Prolog - summing up predicate results
假设我有以下谓词:
func1(X,B,R)
我给它提供了一定的X和B,作为回报,它给了我5个不同的R结果。
编辑:X和B没有指定范围。 相反,X指定一个整数(例如120),而B指定所有三次(小于1的整数),其三次方小于X。func1所做的是计算R作为余数。 在这种情况下,X = 120:
B = 1, R = 119 (120-1^3)
B = 2, R = 112 (120-2^3)
B = 3, R = 93 (120-3^3)
B = 4, R = 56 (120-4^3)
由于5 ^ 3 = 125(大于120),因此不会计算B = 5,因此在此处停止。
我如何做这样的谓词:
func2(R,S)
那将接受R给出的所有结果,将它们加总并存储在S中吗?
谢谢!
首先,由于B
的值完全可以从X
的值派生,所以我不会在func1
中将两者都作为参数。 我将介绍谓词func3/2
,如果第二个参数可以从第一个参数func3/2
,则该谓词为true( 即 ,如果B
可以从X
func3(X, B)
,则func3(X, B)
为true):
func1(X, R) :-
func3(X, B),
...
如果查询func1(120, R)
,将会得到R
一个或多个结果。 然后,您可以使用我在评论中指出的findall/3
:
func2(X, S) :-
findall(R, func1(X, R), Rs),
sumlist(Rs, S).
要定义func3/2
,最干净的方法是使用CLP(FD):
:- use_module(library(clpfd)).
func3(X, B) :-
B #>= 0,
(X - B^3) #>= 0,
label([B]).
这是func3
的示例:
?- func3(120, B).
B = 1 ;
B = 2 ;
B = 3 ;
B = 4.
between
使用between
并将B
的上限定义为不超过X
的立方根的最大整数:
func3(X, B) :- Limit is floor(exp(log(X) / 3)), between(1, Limit, B).
产生与上面相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.