【问题标题】:Return Integer with Prolog使用 Prolog 返回整数
【发布时间】:2017-11-11 14:02:13
【问题描述】:

我现在试着理解序言。我想输入:convert(s(s(s(X))),Y),输出应该是Y = 3

convert(s(0), 1).
convert(s(s(0)), 2).
convert(s(X),Y) :- convert(X,Y is (Y+1)).

这些是我现在的规则,但只有输入: convert(s(0), 1)。和 convert(s(s(0)), 2)。工作。

如果我的递归可以正常工作,我就不需要规则:convert(s(s(0)), 2)。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: prolog successor-arithmetics


    【解决方案1】:

    这里有两个问题:

    • Y is Y+1,在 Prolog 中没有任何意义;和
    • 请注意,您实际上已经编写了一个函子

    Prolog 认为这是一个调用:

    convert(X,is(Y,Y+1))
    

    is(Y,Y+1)调用,而是作为函子传递。在 Prolog 中没有明确的输入和输出。你调用谓词,通过统一,你得到结果。

    但是我们可以使用递归来解决这个问题:0convert/2 当然是0

    convert(0,0).
    

    s(X) 的转换是X 的转换加一:

    convert(s(X),R) :-
        convert(X,Y),
        R is Y+1.
    

    或者把这些放在一起:

    convert(0,0).
    convert(s(X),R) :-
        convert(X,Y),
        R is Y+1.
    

    现在我们可以调用谓词列出所有 Peano 数字和对应的数字,以及将 Peano 数字转换为数字。我们还可以验证 Peano 数是否为正常数。

    不幸的是,我们不能使用这个谓词从给定的数字中获取 Peano 数:它将与 Peano 数合一,但在尝试寻找另一个 Peano 数时,会陷入无限循环。

    我们可以使用clpfd 库来帮助我们解决这个问题:

    :- use_module(library(clpfd)).
    
    convert(0,0).
    convert(s(X),R) :-
        R #> 0,
        Y #= R-1,
        convert(X,Y).

    【讨论】:

    • 谢谢,它有效!但是为什么给出像 R 这样的大写字母很重要: convert(s(X),R) 但是为什么 convert(s(X),r) 不起作用?
    • @Runner:因为变量以大写字母开头,所以常量是小写字母。这不是惯例(因此不这样做会导致程序不正确)。不想听起来烦人或类似的东西,也许您应该查找一些有关 Prolog 的基础知识。
    • 虽然正确,但您的 clpfd 版本效率极低,因为它需要许多临时变量。高效的版本呢?啊,确实是 s(X)。
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多