2016-03-18 8 views
0

Я проверяю, подключен ли граф и почему-то становится ложным, когда он должен быть правдой.Проверка, подключен ли граф.

allConnected([]). 
allConnected(A|L) :- checkConnect(A,L), allConnected(L). 

checkConnect([],[]). 
checkConnect(X, Head|Y) :- isConnected(X,Head), checkConnect(X,Y). 
isConnected(X,Y) :- edge(X,Y); edge(Y,X). 

edge(a,b). 
edge(b,c). 
edge(c,a). 

Что я делаю для моего предиката проверяет, если каждый узел в allConnected ([а, Ь, с]) связно. Я должен быть правдой, но не могу определить свою ошибку, я пробовал использовать трассировку, но это не помогает.

+0

изменения в 'allConnected ([A | L]): - ... ', иначе он никогда не будет соответствовать. После этого он будет зависеть навсегда :) – CapelliC

+0

@CapelliC: Эта проблема специфична для SWI. Только SWI разрешает операторам более 1000 аргументов. – false

ответ

0

Как указано выше, вы должны добавить квадратные скобки вокруг своих списков: [A | L] вместо A | L и [Head | Y] вместо Head | Y.

Вторая проблема заключается условие завершения в checkConnect:

checkConnect([],[]). 

Вы указываете, что быть истинным, когда оба аргумента могут быть сопоставлены с пустыми списками. Тем не менее, первый параметр checkConnect используется для вызова isConnected и, следовательно, подразумевает, что он является символом, а не списком, указанным в вашем состоянии завершения. Другими словами, checkConnect никогда не будет соответствовать условию остановки.

То, что вы ищете:

checkConnect(_,[]). 

(мы используем подстановочные _, так как мы не заботимся о доступе к переменной в этой точке)