生成多个答案并放入列表而不使用findall / 3

时间:2016-03-05 07:16:09

标签: 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 is X + Y,
    P is X * Y.

s1(Q, N) :-
    findall(X, pred(X, N), Q).

有一些帮助获得上述代码工作因为我是Prolog的新手。 此外,该计划应该做的是:

  

X和Y是两个整数,1&lt; X&lt; Y和X +Y≤100。目标   s1(Q,100)将Q与四个[X,Y,S,P]的列表绑定,其中S   = X + Y和P = X * Y。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是将pred/2分解为递归。辅助谓词,在每次递归调用时处理XY的一个案例。以下内容可能未经过优化,但您可以在逻辑测试中看到它是如何实现的:

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