Я пытаюсь подсчитать количество инверсий в списке. Предикат inversion(+L,-N) объединяет N с числом инверсий в этом списке. Инверсия определяется как X > Y и X появляется перед Y в списке (если X или Y не является 0). Например:
?- inversions([1,2,3,4,0,5,6,7,8],N).
N = 0.
?- inversions([1,2,3,0,4,6,8,5,7],N).
N = 3.
Для того, для чего я использую это, список всегда будет содержать 9 элементов и всегда будет содержать числа 0-8 уникально.
Я новичок в Prolog, и я стараюсь сделать это как можно более кратким и изящным; Похоже, DCG, вероятно, многое поможет. Я читал официальное определение и некоторые учебные сайты, но до сих пор не понимаю, что это такое. Любая помощь будет принята с благодарностью.