如何在prolog中执行此操作而不会导致无限循环?

时间:2012-06-07 18:40:24

标签: prolog infinite-loop

我想在Prolog中做这样的事情:

some_commutative_property(X,Y) :- some_commutative_property(Y,X).
some_commutative_property(1,2).
some_commutative_property(3,4).

这样查询some_commutative_property(1,2).some_commutative_property(2,1).都会返回true。

问题显然是第一行创建了一个无限循环。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:5)

可能有多种解决方案:

  • 将谓词拆分为两个:

    some_commutative_property(X,Y) :- some_commutative_property_aux(X,Y). some_commutative_property(X,Y) :- some_commutative_property_aux(Y,X).

some_commutative_property_aux(1,2).some_commutative_property_aux(3,4).

  • 执行订单:

    some_commutative_property(X,Y) :- X>Y, some_commutative_property(Y,X).

使用some_commutative_property_aux(1,2).some_commutative_property_aux(3,4).这只会假设基本事实仅为some_commutative_property(A,B) A =< B形式。