以下代码完美无缺,但我希望在不使用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。
答案 0 :(得分:0)
执行此操作的一种方法是将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