首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:我被困在一种势在必行的心态中。

Prolog:我被困在一种势在必行的心态中。
EN

Stack Overflow用户
提问于 2014-03-07 20:25:21
回答 5查看 428关注 0票数 3

我正在上一门关于编程范例的课。目前我们正在学习Prolog,而我被困在了另一个范例中。我试图从命令式中转换的一个函数是一个相对简单的函数。

代码语言:javascript
复制
foo(A,B,C)
    if(A > B) C is 1
    if(A < B) C is -1
    if(A = B) C is 0

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

代码语言:javascript
复制
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“语句。我只是卡住了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-08 07:37:09

为了进行声明式的编程,我们必须考虑我们试图声明的内容,然后我们才能描述它。为此,我将尝试编写谓词,以便它能够表达为什么C的值在三种可能的状态之间交替,这取决于AB的相对大小。下面是一个谓词,其形式与您用foo描述的相同:

代码语言:javascript
复制
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 AB<Value>,如果AB的话,那么A就是<relation>。”这个程序由三个描述规则comparison/3的规则组成。“3”表示这条规则定义了作为参数提供给它的3个元素之间的关系。

您可以查询此程序:

代码语言:javascript
复制
?- comparison(1,3, X).
X = less ;
false.
票数 2
EN

Stack Overflow用户

发布于 2014-03-08 08:17:21

也许我误解了,但为什么你不能这样做:

代码语言:javascript
复制
foo(A, B, 1) :- A > B.
foo(A, B, -1) :- A < B.
foo(A, B, 0) :- A =:= B.

也就是说,直接将'C‘的值作为输出参数嵌入。

代码语言:javascript
复制
?- foo(1,3,C).
C = -1 .

?- foo(2,2,C).
C = 0.

如果您已经有了不需要计算的C值,那么没有必要将它声明为变量吗?

票数 1
EN

Stack Overflow用户

发布于 2014-03-07 20:46:12

你能有多条规则吗?

代码语言:javascript
复制
sub(0,0).
sub(E,C) :- C is E/abs(E).

如果为A-B传入0,则这将始终与第一条规则相匹配,然后C将与0相统一。从技术上讲,您只需要一个is,并且使用一个基本案例来定义它。为了使其规则顺序独立,您也可以在子句E \= 0中完成,但是我不知道这是否会验证is,因为\= (不统一)本质上是一样的(没有双关意),但是有任何的基础项,而不仅仅是int。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22260019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档