【问题标题】:Prolog: nat(s(s(0))) to "normal" decimal numbersProlog: nat(s(s(0))) 到“正常”十进制数
【发布时间】:2020-06-16 20:21:50
【问题描述】:

如果在 Prolog 中这样定义整数:

nat(0).
nat(s(X)) :- nat(X).

如何将这样的数字转换为十进制数?

输入例如:

s(s(s(0)))

我可能应该补充一点,我对 Prolog 很陌生。

编辑: 我是这样尝试的:

nat(0).
nat(s(X)) :- nat(X).

convert(N, C) :-
    C is C + 1,
    nat(N),
    convert(N, C).

【问题讨论】:

  • 你尝试了什么?什么不工作?
  • 我添加了我的一项尝试。
  • 我想要的是一个“正常”的数字表示,比如 0, 1, 2, 3, ... 以便将其用作索引或能够使用比较。
  • Prolog 不是 C,C = C +1 由于统一,在 Prolog 中总是失败。您必须使用另一个名称 C1 is C + 1 例如

标签: prolog successor-arithmetics


【解决方案1】:

基本上有两种情况需要介绍:

  1. 基本情况0映射到0;和
  2. 递归案例s(X) 使用X 的结果。

因此,基本情况如下所示:

convert(<b>0</b>, <b>0</b>).

因此递归情况如下所示:

convert(S(X), N) :-
    convert(X, N1),
    ….

因此 是在给定N1 的情况下确定N 所需执行的步骤。我把它留作练习。

【讨论】:

  • 谢谢,我将在整个代码库中丢弃这个数字的递归定义,因为我无法正确计算它。
  • 可以编写足够多的函数来用它们进行计算——这就是这个模型对于基础数学的全部意义——但这既不方便也不高效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多