2

必须编写一些序言规则来表示等腰三角形的几何特性。

第一条规则是说

angleEqual(angle(A,B,C),angle(A,C,B)):- 
    triangle(A,B,C), 
    lineEqual(line(A,B),line(A,C)).

第二条规则说

lineEqual(line(A,B),line(A,C)):- 
    triangle(A,B,C), 
    angleEqual(angle(A,B,C),angle(A,C,B)).

但是,如果给定以下事实,这两个规则一起将导致相互依赖,并且 prolog 将永远循环

triangle(a,b,c).
lineEqual(line(a,b),line(a,c)).

并查询

?- angleEqual(A,B).

任何想法?非常感谢。

4

1 回答 1

0

我认为您可以删除“命名冗余”,因为您有说明实体几何属性的事实。

angleEqual(angle(A,B,C),angle(A,C,B)):-
    triangle(A,B,C),
    equal(line(A,B),line(A,C)).

lineEqual(line(A,B),line(A,C)):-
    triangle(A,B,C),
    equal(angle(A,B,C),angle(A,C,B)).

triangle(a,b,c).
equal(line(a,b),line(a,c)).

这样你的查询就会得到答案

?- angleEqual(A,B).
A = angle(a, b, c),
B = angle(a, c, b).

我必须说我对表示有点怀疑,我会尝试将描述建立在距离测量的基础上。一些 Prolog(例如,SWI-Prolog)配备了高精度数值评估和有理算术。但肯定描述会比你的更难......

于 2013-01-05T07:17:11.687 回答