我正在上一门关于编程范例的课。目前我们正在学习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“语句。我只是卡住了。
发布于 2014-03-08 07:37:09
为了进行声明式的编程,我们必须考虑我们试图声明的内容,然后我们才能描述它。为此,我将尝试编写谓词,以便它能够表达为什么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 of A和B是<Value>,如果A是B的话,那么A就是<relation>。”这个程序由三个描述规则comparison/3的规则组成。“3”表示这条规则定义了作为参数提供给它的3个元素之间的关系。
您可以查询此程序:
?- comparison(1,3, X).
X = less ;
false.发布于 2014-03-08 08:17:21
也许我误解了,但为什么你不能这样做:
foo(A, B, 1) :- A > B.
foo(A, B, -1) :- A < B.
foo(A, B, 0) :- A =:= B.也就是说,直接将'C‘的值作为输出参数嵌入。
?- foo(1,3,C).
C = -1 .
?- foo(2,2,C).
C = 0.如果您已经有了不需要计算的C值,那么没有必要将它声明为变量吗?
发布于 2014-03-07 20:46:12
你能有多条规则吗?
sub(0,0).
sub(E,C) :- C is E/abs(E).如果为A-B传入0,则这将始终与第一条规则相匹配,然后C将与0相统一。从技术上讲,您只需要一个is,并且使用一个基本案例来定义它。为了使其规则顺序独立,您也可以在子句E \= 0中完成,但是我不知道这是否会验证is,因为\= (不统一)本质上是一样的(没有双关意),但是有任何的基础项,而不仅仅是int。
https://stackoverflow.com/questions/22260019
复制相似问题