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
请参阅了解。谢谢!理解。谢谢!