对于我正在编写的程序,我需要列出一个列表,一对数字代表一个产品,两个给定数字的总和.
现在我有一个函数,我可以指定我想在列表中添加一个列表的次数,稍后将使用完整功能进行扩展.
这就是我所拥有的:
s1(0, X).
s1(Q, X) :-
N is Q - 1,
multiply(2, 3, Y),
A = Y ,
add(2, 3, Z),
B = Z,
addToEnd([A], [B], X),
s1(N,X).
multiply(A, B, C):-
C is A * B.
add(A, B, C) :-
C is A + B.
addToEnd([], L, L).
addToEnd([H|T], L2, [H|L3]) :-
addToEnd(T, L2, L3).
Run Code Online (Sandbox Code Playgroud)
但是,当我运行时s1(2,X)
,我得到了[6,5]
返回,然后没有别的,它只是挂起.当我跑s1(0,X)
,我得到true
,然后false
当我击中;
谁能帮我这个?我看不出我做错了什么,我觉得它应该有效!
为了澄清我觉得这应该如何工作:我打电话s1(2,X).
N = 1
,[6,5]
添加到列表中X([[6,5]])
s1(1,X). …
很抱歉在这个问题上发布了另一个问题,但我似乎只是在这里转圈!
对于我的程序,我需要列出一个列表,每个子列表包含2个数字,X和Y以及这两个数字的总和和乘积.到目前为止,我有以下内容:
genList(100,N, X,[]).
genList(S,N, X,[[X,Y,Sum,Product]|Xs]):-
Y is N+1,
Sum is X+Y,
NewS is Sum,
Sum<101,
Product is X*Y,
N1 is N+1,
genList(NewS,N1, X,Xs).
genList(S,N,X,Q):-
N+X < 101,
NextX is X + 1,
genList(0,NextX,NextX,Q).
Run Code Online (Sandbox Code Playgroud)
目标是找到sum <= 100的每对数字.因此,通过上面的一个起始值运行,X会发现每对1 <X <Y,其中sum <= 100,并且通过它运行所有数字2 -N将给出可能的对的完整列表.
对于那些感兴趣的人,我正在解决的问题是和/产品问题,在这里描述(页面上的第二个)
如果有人可以帮助这一点,将不胜感激!
此外,没有内置的prolog谓词可以使用,因此这样做的复杂方式而不是findall.
此谓词生成的小输出提取如下:
[[5,6,11,30],[5,7,12,35],[5,8,13,40],[5,9,14,45],[5,10,15,50] [5,11,16,55],[5,12,17,60],[5,13,18,65],[5,14,19,70],[5,15,20,75] [5,16,21,80],[5,17,22,85],[5,18,23,90],[5,19,24,95],[5,20,25,100],[ 5,21,26,105],[5,22,27,110],......
我认为它非常接近,但仍然有些不太正确.
它循环通过数字对,但需要使用";" 查看所有答案,这不是我想要的.此外,在所有答案都用完后,它返回false.我只是想不出来.
此外,它给出了起始值的完整答案,但每次都删除一个子列表,直到我只剩下最后一组对.
例如genList(0,48,48,Q).给我:
[[48,49,97,2352],[48,50,98,2400],[48,51,99,2448],[48,52,100,2496]]
[[48,49,97,2352],[48,50,98,2400],[48,51,99,2448],[48,52,100,2496],[49,50,99,2450],[49,51,100,2499]]
[[48,49,97,2352],[48,50,98,2400],[48,51,99,2448],[49,50,99,2450],[49,51,100,2499]]
[[48,49,97,2352],[48,50,98,2400],[49,50,99,2450],[49,51,100,2499]]
[[48,49,97,2352],[49,50,99,2450],[49,51,100,2499]]
[[49,50,99,2450],[49,51,100,2499]]
false.
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每次都会删除子列表,我只是看不清楚原因!
prolog ×2