У меня есть некоторые данные, объявленные в файле Prolog, которые выглядят следующим образом:
gen1(grass).
gen1(poison).
gen1(psychic).
gen1(bug).
gen1(rock).
...
gen1((poison, flying)).
gen1((ghost, poison)).
gen1((water, ice)).
...
weak1(grass, poison).
weak1(grass, bug).
weak1(poison, rock).
strong1(grass, rock).
strong1(poison, grass).
strong1(bug, grass).
strong1(poison, bug).
strong1(psychic, poison).
strong1(bug, poison).
strong1(bug, psychic).
strong1(rock, bug).
Обратите внимание, что данные не определяют strong1
или weak1
для соединения gen1(...)
. Они определяются правилами, которые не способствуют минимальному рабочему примеру. Я упоминаю их, потому что может быть полезно знать, что они существуют.
Я пытаюсь найти отношения между этими терминами, образующими цикл. Вот один пример функции:
triangle1(A, B, C) :-
setof(A-B-C, (
gen1(A), gen1(B), gen1(C), A \= B, A \= C, B \= C,
strong1(A, B), strong1(B, C), strong1(C, A)
), Tris),
member(A-B-C, Tris).
Эта настройка удаляет дубликаты, где A
, B
и C
находятся в одном и том же порядке. Однако он не удаляет дубликаты в разных порядках. Например:
?- triangle1(A, B, C),
member(A, [bug, grass, rock]),
member(B, [bug, rock, grass]),
member(C, [bug, rock, grass]).
A = bug,
B = grass,
C = rock ;
A = grass,
B = rock,
C = bug ;
A = rock,
B = bug,
C = grass ;
false.
Этот запрос должен возвращать только один набор [A, B, C]
.
Я думал об использовании sort/2
, но бывают случаи, когда простая сортировка меняет смысл ответа:
?- triangle1(A, B, C),
sort([A, B, C], [D, E, F]),
\+member([D, E, F], [[A, B, C], [B, C, A], [C, A, B]]).
A = D, D = bug,
B = F, F = psychic,
C = E, E = poison .
Я также пробовал <
и >
, но они, по-видимому, не работают с атомами.
Есть предположения?
(Я просмотрел похожие вопросы, но понятия не имею, как то, что я здесь делаю, сравнивается с тем, что делают другие люди)
РЕДАКТИРОВАТЬ: Согласно комментарию о минимальном рабочем примере.