У меня есть следующий код: Имейте в виду, что, хотя этот код работает в списках, эти списки представляют собой множества, поэтому [1,1,2,2,3,3] и [1,2,3] должны быть эквивалентными ,Почему этот предикат Prolog работает?
%contains(L1, L2), returns true if L1 contains L2
contains(_, []).
contains(L1, [Head|Tail]) :- member(Head, L1), contains(L1, Tail).
%equals(L1, L2), returns true if L1 is equal to L2
equals([X|L1],[X|L2]) :- equals(L1, L2).
equals(L1, L2) :- contains(L1, L2), contains(L2, L1).
Идея состоит в том, что равенства ([1,2,3], [1,2,1,3]) должны возвращать значение true. Однако, исходя из приведенного выше определения, я бы предположил, что следующее:
- равно ([1,2,3], [1,2,1,3]) соответствует первому правилу и вызывает равна ([2,3], [2,1,3]]).
- equals ([2,3], [2,1,3]]) соответствует второму правилу и содержит ссылки ([2,3], [2,1,3]), содержит ([2,1 , 3], [2,3]).
- содержит ([2,3], [2,1,3]) выходит из строя, и равна возвращается No.
И все же он до сих пор работает. И другие попытки запутать его. Может кто-нибудь, пожалуйста, объясните мне это?
(реализация Пролог: SWI-Prolog версии 2.7.12)
На самом деле, это первая программа Prolog (или, точнее, домашнее задание), над которой я когда-либо работал, поэтому я действительно не очень далеко. Я полный новичок. Во всяком случае, спасибо, что объяснили это мне. –