首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog -简化规则或语句

Prolog -简化规则或语句
EN

Stack Overflow用户
提问于 2018-10-08 10:15:59
回答 1查看 262关注 0票数 0

我一直在研究Prolog可以自动简化语句的方法。这是因为我计划从外部源接收Prolog语句,而不一定要手动创建。

我从诸如Simplify Expressions in Prolog这样的问题中看到,数学表达式可以简化,而Prolog处理得很好。

不过,我想知道它是否还能做点别的。请考虑以下几点:

代码语言:javascript
运行
复制
and(X, Y) :- X, Y.

simplified(X) :- X.

?- simplified(and(5 > 3, 5 > 3)).

在这个例子中,我有一个简单的语句,它接受两个值。但在本例中,这两条语句是相同的,因此没有意义。我想知道Prolog是否有一种方法,或者是否有一种方法来检测它来删除它,以便它只对语句进行一次而不是两次评估,从而简化了它需要执行的调用。

我希望这是有意义的,我意识到这个问题可能有点奇怪,但我有一个明确的理由想知道这个问题,并计划在可能的情况下做一些更复杂的事情。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-08 12:12:04

您可以构造一个谓词来简化表达式。

例如,我们知道,and(X, Y) ( XY相等)等于X本身。

因此,我们可以编写如下谓词:

代码语言:javascript
运行
复制
simplify(and(X1, X2), Y1) :-
    simplify(X1, Y1),
    simplify(X2, Y2),
    Y1 == Y2,
    !.
simplify(or(X1, X2), Y1) :-
    simplify(X1, Y2),
    simplify(X2, Y1),
    Y1 == Y2,
    !.
simplify(not(not(X)), Y) :-
    simplify(X, Y),
    !.
 simplify(X, X).

在这里,我们定义了三个规则:and(X, X)等于Xor(X, X)等于Xnot(not(X))等于X。我们会进行额外的调用,因为有not(not(and(3 < 5, 3 < 5)))是可能的,所以我们仍然希望简化内部值。这样我们就可以得到:

代码语言:javascript
运行
复制
?- simplify(not(not(and(3 < 5, 3 < 5))), X).
X =  (3<5).

还可以添加其他项(在前一个代码片段中的最后一个子句之前)如下:

代码语言:javascript
运行
复制
simplify(X > Y, S) :-
    simplify(Y < X, S).

simplify(X >= Y, S) :-
    simplify(Y =< X, S).

例如,and(5 < 3, 3 > 5)也被简化为3 < 5

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

https://stackoverflow.com/questions/52700063

复制
相关文章

相似问题

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