Prolog 列出建筑问题
对于我的程序,我需要制作一个列表列表,每个子列表包含两个数字,X和Y以及这两个数字的和和和积。 到目前为止,我有以下几点: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). 正如您所看到的,每次都会删除一个子列表,我就
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)
- 那我要他们的一双
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).