Prolog 列出建筑问题

Prolog 列出建筑问题,prolog,clpfd,Prolog,Clpfd,对于我的程序,我需要制作一个列表列表,每个子列表包含两个数字,X和Y以及这两个数字的和和和积。 到目前为止,我有以下几点: genList(95, X,[]):-!. genList(N, X,[[X,Y,Sum,Product]|Xs]):- Y is N+1, Sum is X+Y, Sum<101, Product is X*Y, N1 is N+1, genList(N1, X,Xs). 正如您所看到的,每次都会删除一个子列表,我就

对于我的程序,我需要制作一个列表列表,每个子列表包含两个数字,X和Y以及这两个数字的和和和积。 到目前为止,我有以下几点:

genList(95, X,[]):-!.
genList(N, X,[[X,Y,Sum,Product]|Xs]):-
    Y is N+1,
    Sum is X+Y,
    Sum<101,
    Product is X*Y,
    N1 is N+1,
    genList(N1, X,Xs).

正如您所看到的,每次都会删除一个子列表,我就是不明白为什么

我感觉你在用错误的方式解决问题;我必须承认我真的不明白你的谓词在做什么


目标是找到sum可以利用Prolog回溯的每一对数字。只要说出你想要什么。例如,你可以说:

  • 我希望
    X
    介于
    1
    100
    之间
  • 我希望
    Y
    介于
    1
    min(100-X,X)
    之间
  • 那我要他们的一双
让我们看看
validPair/1
谓词是什么样子的:

validPair(X-Y) :-
    between(1, 100, X),
    Limit is min(100 - X, X),
    between(1, Limit, Y).
你可以用你的名字来称呼它

?- validPair(X).
并使用
浏览结果
,或使用
findall/3
构建所有匹配对的列表

编辑:即使使用递归,我们也可以保留语句:

  • 我希望
    X
    介于
    1
    100
    之间
  • 我希望
    Y
    介于
    1
    min(100-X,X)
    之间
  • 那我要他们的一双
因此,这样做的一个想法是设置一个worker谓词:

validPair(Result) :-
    validPair(0, 0, Result).
validPair(X, Y, R) :-
    ...
然后设置基本情况:

validPair(101, _Y, []) :- !.
在worker谓词中,为了实现我们在某些条件下所做的语句:

validPair(X, Y, [SomeStuff|R]) :-
    X =< 100,
    Limit is min(100 - X, X),
    Y =< Limit,
    !,
    % we can go on and increment Y once we're finished
    validPair(X, NextY, R).
validPair(X, Y, R) :-
    % if we come here that means that Y is finished growing and
    % we have to increment X
    NextX is X + 1,
    validPair(NextX, 0, R).
validPair(X,Y[SomeStuff|R]):-
X=<100,
极限为最小值(100-X,X),
Y=<极限,
!,
%完成后,我们可以继续增加Y
validPair(X,NextY,R)。
有效空气(X,Y,R):-
%如果我们来到这里,这意味着Y已经长大了
%我们必须增加X
NextX是X+1,
validPair(NextX,0,R)。

啊,是的,对于这个程序,除了算术和cut之外,我们不允许使用任何prolog内置程序-可能应该提到这一点!谢谢,莫格。这就快到了,但是这里的限制因素是sumHaha,我想不是,只是在我的尝试中,我再次返回了“false”,就像我在另一个问题中一样:(这很烦人,因为它太接近我需要的东西了,但我就是不能让它工作。嗯,我会尝试更多的东西,如果它仍然没有发生,我会发回这里…实际上你甚至不必在切割前添加条件。我写的很好,因为你选择100-X和0之间,你不能超过100。你只需要切换X和Y In你的成绩很好,你好,莫格,还是不太好!我和开场白相处不好…如果你能再帮我一点,我将不胜感激!
validPair(Result) :-
    validPair(0, 0, Result).
validPair(X, Y, R) :-
    ...
validPair(101, _Y, []) :- !.
validPair(X, Y, [SomeStuff|R]) :-
    X =< 100,
    Limit is min(100 - X, X),
    Y =< Limit,
    !,
    % we can go on and increment Y once we're finished
    validPair(X, NextY, R).
validPair(X, Y, R) :-
    % if we come here that means that Y is finished growing and
    % we have to increment X
    NextX is X + 1,
    validPair(NextX, 0, R).