Prolog:我陷入了一种命令式的心态

标签 prolog declarative-programming

我正在上一门关于编程范式的类(class)。目前我们正在学习 Prolog,而我陷入了不同的范式。我试图从命令式转换的函数之一是一个相对简单的函数。

foo(A,B,C)
    if(A > B) C is 1
    if(A < B) C is -1
    if(A = B) C is 0

我可以很容易地在 Prolog 中做到这一点。

foo(A,B,C) :- sub(A-B,C).

sub(E, C) :- E = 0, C is 0.
sub(E, C) :- E > 0, C is 1.
sub(E, C) :- E < 0, C is -1.

问题是,我只能在整个谓词中使用一个“is”(不能定义一个较小的谓词来调用 Is 并调用它或其他任何东西),而且我不能使用 Prolog 的 if/else 结构。我不知道如何以声明的方式思考这个问题。

我想也许我可以做一些像 C is (A-B)/abs(A-B) 这样的事情,但是在 A=B 时会中断,并且需要 2 个“is”语句。我只是卡住了。

最佳答案

为了声明式编程,我们必须考虑要声明的内容,然后才能对其进行描述。为此,我会尝试编写谓词,以便它表达为什么 C 的值。根据 A 的相对大小在三种可能的状态之间交替和 B .这是一个与您用 foo 描述的形式相同的谓词:

comparison(A, B, less)     :-  A < B.
comparison(A, B, equal)    :-  A =:= B. %% =:=/2 is "True if expression A evaluates to a number equal to B".
comparison(A, B, greater)  :-  A > B.

您不需要前端谓词 foo/3 .您可能会这样阅读这些行:“如果 comparisonA 关于 B,则 <Value>A<relation>。”该程序由描述规则 B 的三个规则组成. “3”表示此规则定义了作为参数提供给它的 3 个元素之间的关系。

你可以查询这个程序:

?- comparison(1,3, X).
X = less ;
false.

关于Prolog:我陷入了一种命令式的心态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22260019/

相关文章:

Java Stream 在单个循环中以声明方式单独按多个字段分组

wpf - WPF/XAML 的开源替代品有哪些?

functional-programming - 函数式编程是声明式编程的一种吗?

c# - 编程中的声明式范式和命令式范式有什么区别?

prolog - 以声明方式解决汉诺塔(Prolog)

concurrency - 接收目标列表作为输入的元谓词

list - 到达序言中的列表末尾

javascript - 写一个一元函数链接器,在 codewars 上出现 TypeError 但在 repl.it 上没有错误?

prolog - 同一语句中的 AND-OR - Prolog

prolog - 在 Prolog 中将上下文无关文法转换为下推自动机