由于相互依赖性,Prolog循环

时间:2013-01-05 04:51:05

标签: prolog infinite-loop

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

首先要说的是

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).

有什么想法吗?非常感谢。

1 个答案:

答案 0 :(得分: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).

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