Trying to implement commutativity in Prolog

2019-08-27 22:36发布

I am trying to create a knowledge base. My problem has terminal/1 and connected/2 and I have defined the following rule:

connected(X,Y) :- connected(Y,X).

For reasons I now understand (I think), this went into an infinite recursion.

Then, I tried search SO and found this question: Alternative to express "Commutativity" in Prolog? . Based on the answers provided, I tried to change my above fact to the following:

connected(X, Y) :- is_connected(Y, X) /\ is_connected(X, Y).
is_connected(X, Y) :- terminal(X) /\ terminal(Y) /\ connected(X , Y).

However, this doesn't give me the results I was hoping for. If I define a rule connected(t1,t7), I am hoping to get yes if I ask the question connected(t7,t1).

1条回答
老娘就宠你
2楼-- · 2019-08-27 23:10

I managed to figure this out.

I changed this:

connected(X, Y) :- is_connected(Y, X) /\ is_connected(X, Y).
is_connected(X, Y) :- terminal(X) /\ terminal(Y) /\ connected(X , Y).

to:

is_connected(X, Y) :- connected(Y, X); connected(X, Y).

As it turns out, I also need to be asking the corrected question. Instead of asking connected(X,Y), I will now be asking is_connected(X,Y).

查看更多
登录 后发表回答