将输出合并到 Prolog 中的一个列表中

标签 merge prolog

我有一个序言作业,要求我们列出两个给定范围内的所有数字对。我可以让它输出(使用一个函数)以下内容,但我不知道如何合并所有输出。这是调用函数的输出:

?- i(L,5,7).
L = [(5, 5),  (5, 6),  (5, 7)] ;
L = [(6, 5),  (6, 6),  (6, 7)] ;
L = [(7, 5),  (7, 6),  (7, 7)] ;

这是代码(间隔方法是教授定义的,不允许修改):

interval(X,L,H) :-
    number(X),
    number(L),
    number(H),
    !,
    X>=L,
    X=<H.

interval(X,X,H) :-
    number(X),
    number(H),
    X=<H.

interval(X,L,H) :-
    number(L),
    number(H),
    L<H,
    L1 is L+1,

    interval(X,L1,H).

i(L,X,Y):-
    interval(N2,X,Y),
    setof((N2,N),interval(N,X,Y),L).

我正在寻找这样的输出:

L = [ (5, 5), (5, 6), (5, 7), (6, 5), (6, 6), (6, 7), (7, 5), (7, 6), (7, 7)]

最佳答案

问题在于:

i(L,X,Y):-
    <b>interval(N2,X,Y),</b>
    setof((N2,N),interval(N,X,Y),L).

首先将N2设置为区间中的一个数字,然后您要求为该给定数字生成一个集合N2和一个变量号 N.

然而,您可以简单地在 setof/3 的目标中定义一个复合:

i(L,X,Y) :-
    setof((N2,N),<b>(interval(N2,X,Y),</b>interval(N,X,Y)<b>)</b>,L).

不过,也许更优雅的方式(可能更 Prolog)是定义一个 interval_tuple/3 谓词:

interval_tuple(X,Y,(N,N2)) :-
    interval(N,X,Y),
    interval(N2,X,Y).

然后在那个谓词上调用你的 setof/3listof/3:

i(L,X,Y) :-
    listof(Tup,interval_tuple(X,Y,Tup),L).

关于将输出合并到 Prolog 中的一个列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42166989/

相关文章:

mercurial - 我现在如何 merge Hg 中的两个头?

git - 为什么会发生 merge 冲突?

git - Git 是否支持仅追加文件的自动 merge 冲突解决?

prolog - SWI Prolog 函数包

prolog - GNU Prolog `delete/3` 谓词中的异常?

audio - 如何使用 Libav API 合并多个音频文件?

将远程 ‘origin/develop’ merge 到 ‘origin/master’ 的 Git 工作流程

list - 获取列表中的重复项并在列表中显示答案

prolog - Prolog 中的 "well behaved predicate"是什么?

Prolog:从文件中读取列表