2015-11-19 1 views
1

У меня есть следующие факты:параметров обмена

make(product_A, product_Z, product_Y). 
    make(P, X, Y) :- make(P, Y, X). 

, которые я хотел, чтобы убедиться, что полуфабрикаты (т.е. product_Z и product_Y), из которой сделан PRODUCT_A будут справедливо независимо от их положений, как положить в запрос.

Так что я хотел, чтобы этот вопрос:

make(product_A, product_Y, product_Z). 

и это одно:

make(product_A, product_Z, product_Y). 

должны рассматриваться Пролога в качестве эквивалентов (то же самое) - даже если я не размещены оба случая как факты в базу данных Prolog. Другими словами, я хотел бы иметь параметры (product_Z и product_Y) для обмена в запросе.

Но когда я поставил код как в начале, Prolog, кажется, повторяет бесконечный цикл.

Итак, как я могу это достичь?

ответ

6

Причина бесконечного вывода состоит в том, что можно перевернуть аргументы назад (и вперед, если хотите). Вы можете ввести новое имя для сканирующего предиката:

cmake(A,B,C) :- make(A,B,C). 
cmake(A,B,C) :- make(A,C,B). 

В отличие от решения с одним, вы остаетесь логически чистым.

Несмотря на то, что аргументы с переворачиванием работают для более чем двух зависимостей, вы экспоненциально взрываете пространство поиска (так как вам нужно охватить все перестановки n аргументов). В качестве альтернативы вы можете передать отсортированный список зависимостей в качестве второго аргумента. Затем вы сортируете свой ввод один раз и выполняете поиск.

+0

Спасибо. Поэтому список нужно сортировать из-за обеспечения порядка параметров, и тогда я должен создать все факты в алфавитном порядке? – forsberg

2

Вы должны добавить once в правиле, например, так:

make(A, B, C) :- once(make(A, C, B)).

Таким образом, он останавливает факты обработки и не будет на бесконечном цикле.

Смежные вопросы