Prolog 不使用findall/3生成多个答案并放入列表
下面的代码工作得很好,但我希望不使用Prolog 不使用findall/3生成多个答案并放入列表,prolog,Prolog,下面的代码工作得很好,但我希望不使用findall/3函数就可以得到列表中的多个答案 bet(N, M, K) :- N =< M, K = N. bet(N, M, K) :- N < M, N1 is N+1, bet(N1, M, K). pred([X, Y, S, P], N) :- N1 is N - 1, bet(2, N1, X), X1 is X + 1, N2 is N - X, bet(X1, N2, Y), S
findall/3
函数就可以得到列表中的多个答案
bet(N, M, K) :- N =< M, K = N.
bet(N, M, K) :- N < M, N1 is N+1, bet(N1, M, K).
pred([X, Y, S, P], N) :-
N1 is N - 1,
bet(2, N1, X),
X1 is X + 1,
N2 is N - X,
bet(X1, N2, Y),
S is X + Y,
P is X * Y.
s1(Q, N) :-
findall(X, pred(X, N), Q).
bet(N,M,K):-N=
我对上面的代码有一些帮助,因为我不熟悉Prolog。
此外,程序应该做的是:
X和Y是1一种方法是将
pred/2
分解为递归。辅助谓词,在每次递归调用中处理X
和Y
的一种情况。以下内容可能无法优化,但您可以在逻辑测试中看到它是如何实现这一点的:
pred(Q, N) :-
pred(Q, 2, 3, N). % Start with values X=2, Y=3
pred([], X, _, N) :- % Case in which X has reached max, so we're done
X >= N.
pred(Q, X, Y, N) :- % Case in which X is in range, but Y is at max, so next X, restart Y
X < N,
Y >= N - X,
X1 is X + 1,
Y1 is X1 + 1,
pred(Q, X1, Y1, N).
pred([[X, Y, S, P]|Qs], X, Y, N) :- % Case in which X and Y are within range
X < N,
Y < N - X,
S is X + Y,
P is X * Y,
Y1 is Y + 1,
pred(Qs, X, Y1, N). % Recurse using next Y
pred(Q,N):-
pred(Q,2,3,N)。%从值X=2,Y=3开始
pred([],X,u,N):-%的情况下,X已经达到最大值,所以我们完成了
X>=N。
pred(Q,X,Y,N):-%情况下,X在范围内,但Y在最大值,所以下一个X,重新启动Y
X=N-X,
X1是X+1,
Y1是X1+1,
pred(Q,X1,Y1,N)。
pred([[X,Y,S,P]|Qs],X,Y,N):-%情况下,X和Y在范围内
X
一种方法是将pred/2分解为递归。辅助谓词,在每次递归调用中处理X
和Y
的一种情况。以下内容可能无法优化,但您可以在逻辑测试中看到它是如何实现这一点的:
pred(Q, N) :-
pred(Q, 2, 3, N). % Start with values X=2, Y=3
pred([], X, _, N) :- % Case in which X has reached max, so we're done
X >= N.
pred(Q, X, Y, N) :- % Case in which X is in range, but Y is at max, so next X, restart Y
X < N,
Y >= N - X,
X1 is X + 1,
Y1 is X1 + 1,
pred(Q, X1, Y1, N).
pred([[X, Y, S, P]|Qs], X, Y, N) :- % Case in which X and Y are within range
X < N,
Y < N - X,
S is X + Y,
P is X * Y,
Y1 is Y + 1,
pred(Qs, X, Y1, N). % Recurse using next Y
pred(Q,N):-
pred(Q,2,3,N)。%从值X=2,Y=3开始
pred([],X,u,N):-%的情况下,X已经达到最大值,所以我们完成了
X>=N。
pred(Q,X,Y,N):-%情况下,X在范围内,但Y在最大值,所以下一个X,重新启动Y
X=N-X,
X1是X+1,
Y1是X1+1,
pred(Q,X1,Y1,N)。
pred([[X,Y,S,P]|Qs],X,Y,N):-%情况下,X和Y在范围内
X
请参阅了解。谢谢!理解。谢谢!