我正在上一门关于编程范式的类(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
.您可能会这样阅读这些行:“如果 comparison
是 A
关于 B
,则 <Value>
和 A
是 <relation>
。”该程序由描述规则 B
的三个规则组成. “3”表示此规则定义了作为参数提供给它的 3 个元素之间的关系。
你可以查询这个程序:
?- comparison(1,3, X).
X = less ;
false.
关于Prolog:我陷入了一种命令式的心态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22260019/