小编Xav*_*uos的帖子

Prolog - 递归列表构建

对于我正在编写的程序,我需要列出一个列表,一对数字代表一个产品,两个给定数字的总和.

现在我有一个函数,我可以指定我想在列表中添加一个列表的次数,稍后将使用完整功能进行扩展.

这就是我所拥有的:

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). …

prolog

4
推荐指数
1
解决办法
6547
查看次数

prolog列表构建更麻烦

很抱歉在这个问题上发布了另一个问题,但我似乎只是在这里转圈!

对于我的程序,我需要列出一个列表,每个子列表包含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
推荐指数
1
解决办法
820
查看次数

标签 统计

prolog ×2