2017-02-04 4 views
0

Я пытаюсь сделать invert/2. Я хочу, чтобы он игнорировал порядок своих аргументов, так что вам не нужно беспокоиться о том, какая половина инверсии является той, которую вы знаете, и чтобы вам не приходилось повторять себя, указав инверсии как факты. Я в настоящее времяКак сделать правило неудачным, не доказав, что что-то ложно?

invert(Left, Right) :- 
    call_with_depth_limit(invert(Right, Left), 1, Result), 
    Result \= depth_limit_exceeded. 

в качестве первого invert правила. Это в основном работает, но если invert(a, b)., то ?- invert(b, X). дает как X = a, так и false, что совсем не то, что я хочу.

+0

Не инвертирует (A, B): - инвертирует (B, A),! .' работает? – Enigmativity

+0

@Enigmativity 'ERROR: Out of local stack' – Viko

+0

@lurker. Тогда почему он не отображается в конце списка результатов каждого запроса? – Viko

ответ

1

Есть две вещи, которые я бы рассмотрел. Во-первых, убедитесь, что предикат, который вы создаете для установления симметрии отношений в ваших фактах, имеет другое имя, чем ваши факты. Наличие имени одинаково обычно приводит к таким проблемам, как бесконечная рекурсия. Во-вторых, если факты находятся под вашим контролем, чтобы заявить, будьте последовательны в отношении того, явно ли факты объявляют симметричный случай или нет. Если они это сделают, вам не нужен дополнительный предикат. Если они этого не делают, вам нужен дополнительный предикат.

Например, с симметрий явно заявил:

opposite(a, b). 
opposite(b, a). 
opposite(c, d). 
opposite(d, c). 

Вам не нужен дополнительный предикат, чтобы получить симметричные решения для opposite.

пример, где симметрии явно не объявлены:

opposite(a, b). 
opposite(c, d). 

inverted(X, Y) :- opposite(X, Y). 
inverted(X, Y) :- opposite(Y, X). 

В этом случае запрос inverted/2 вместо opposite/2 будет обрабатывать симметрию в отношениях.

+0

Теперь все попытки найти инверсию дают правильный ответ, но если я нажимаю ';', они петля бесконечно. – Viko

+1

@Viko: определение lurker всегда заканчивается. – false

+1

@Viko Я считаю, что правильно ответил на вопрос, поскольку он был поставлен, и учитывая ограниченный контекст. Ваш неопределенный цикл вызван тем, что вы не показываете. Я бы предложил опубликовать новый вопрос с вашим новым кодом, чтобы показать, что происходит. Было бы неправильно изменить код в этом вопросе, поскольку он изменит контекст ответа. – lurker