【问题标题】:How to append numbers in a specific range to a list in prolog如何将特定范围内的数字附加到序言中的列表中
【发布时间】:2016-03-28 08:14:59
【问题描述】:

我正在尝试将一些数字附加到列表中,这些数字的范围从 XY 其中 X 是下限,Y 是上限,然后将这些生成的数字保存到一个列表。 我试过这个:

domains
    list=integer*.

predicates
    nondeterm generate(integer,integer,list).
    nondeterm append(integer,list,list).

clauses
    append(X,[],[X]).   
    generate(0,0,[]).
    generate(X,X,[]) :-
            write("The Upper And Lower Numbers Are The Same\n").
    generate(X,Y,[X|T]) :-
            X<=Y,
            N=X+1,
            A=N+1,
            append(N,T,Z),
            generate(A,Y,Z).

goal
    generate(1,4,Result).   

但是当我测试目标时,它给了我“没有解决方案”。 我究竟做错了什么? 非常感谢您的帮助。

【问题讨论】:

  • 我猜你应该用 [visual-prolog] 标记问题。
  • 跟踪并查看每次递归调用 generate(A, Y, Z) 时会发生什么。您可能会看到递归案例的问题。乍一看,这个逻辑似乎没有任何意义,X 被递增(N = X + 1)然后结果也被递增(A = N + 1)。然后你在自制的追加上调用append(N,T,Z)(注意:标准prolog已经有一个append,虽然我不知道Visual Prolog是否有,而且它和你的不一样),但T不是' t 实例化。我怀疑这根本不是你想要的。
  • @lurker 谢谢你的澄清,我试图调用内置的附加方法但它不起作用,所以这个自制的方法是真的还是什么?,我正在递增in (N=X+1) 将范围内的下一个数字添加到列表中,并增加该数字 (A=N+1) 以再次调用该函数。抱歉,“T 未实例化”是什么意思?
  • 内置的append要求所有元素都是列表。您的追加将只接受一个术语X 并从中创建一个元素列表[X],并且要求第二个参数是一个空列表[]。它非常有限,并没有真正做太多。 T 未实例化 表示T 没有价值(在您调用append 时)。您的 append 每次都会将 T 实例化为空列表(不确定这是否是您的意图)。
  • @lurker 不,这根本不是我想要的。非常感谢你的协助。但我只想将一个数字附加到特定的非空列表,如果我添加了这个 'append(X,T,[X|T])' ,其中 'T' 是任何非空列表,那会起作用吗?

标签: list prolog append visual-prolog


【解决方案1】:

试试这个:

?= findall(X,between(1,4,X),L).
L = [1, 2, 3, 4].

再见

P.S.:对于 between/3 的纯实现,请参阅:
http://www.jekejeke.ch/idatab/doclet/blog/docs/05_run/05_frequent/advanced/arith.html

【讨论】:

  • OP 正在使用 Visual Prolog。你知道 Visual Prolog 是否有那些预定义的谓词吗?
  • 我在那里看到findall,但没有看到between
  • between 不是 ISO 谓词,有些 Prolog 没有它。例如,GNU Prolog 也没有between。这并不意味着语言有“问题”。尽管 Visual Prolog 在许多方面都非常不标准,这使得从纯 Prolog 的角度来看它非常没有吸引力。
  • @lurker:GNU 确实有 between/3。您必须使用非常旧的版本。它是Prolog prologue 的一部分。因此,虽然不是 ISO,但它与非 ISO 所能获得的 ISO 一样接近。
  • 如果您的 Prolog 系统没有 between/3,您可以从我在答案中给出的链接或任何其他相同的代码中复制粘贴代码。你不能轻易地将 SWI-Prolog 的源代码用于另一个 Prolog 系统,因为它在本机实现了 between/3。
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 2017-07-15
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2023-03-11
相关资源
最近更新 更多