Ответы пользователя по тегу Prolog
  • Возможно ли сравнить позиции элементов в двух списках?

    Помощь на подходе :) но задача не до конца объяснена -- как я понимаю, в первом случае числа идут блоками, а во втором? Хорошо, а может быть в первом случае [1,2,3,3,3,222,1]? Или порядок фиксирован -- т.е. объекты встречаются много раз -- но если 3 идет после 2 и перед 5, т.е. [2,2,2,2,3,3,5] то тройка потом не может появиться позже?

    В этом случае решение такое: r_duplicates -- удаляет дублирующие элементы из обоих списков -- т.е. [1, 1, 1, 2, 2, 2, 3, 3, 3] => превращается в [1,2,3] -- а потом сравнивает списки в лоб.

    r_duplicates([],[]).
    
    r_duplicates([H | T], List) :-
         member(H, T),
         r_duplicates( T, List).
    
    r_duplicates([H | T], [H|T1]) :-
          \+member(H, T),
          r_duplicates( T, T1).
    
    compare_order(X,Y) :- r_duplicates(X,Z), r_duplicates(Y,H), H == Z.
    Ответ написан
  • Как генерировать последовательность вида "0, 1, -1, 2, -2, 3, -3..." в Prolog?

    Вот тут последний ответ объясняет почему это не работает и показывает варианты решения:
    https://stackoverflow.com/questions/19979548/predi...
    Ответ написан
    Комментировать
  • Обязательно ли для логики искусственного интеллекта использовать Prolog?

    Нет, и вот почему:

    ИИ — это научная область
    Пролог — Тьюринг полный язык

    Значит, любые алгоритмы на Прологе, которые решают какие-либо задачи в области ИИ, могут быть написаны и на любом другом Тьюринг-полном языке (С++, Java, Python, etc).

    Обязательно к прочтению: Artificial Intelligence: A Modern Approach
    Ответ написан
    Комментировать
  • Как на Prolog получить второй множитель из уравнения?

    Писал не с нуля, часть кода подсмотрел в сети (так как "давненько я не брал в руки шашки"), но идея довольно проста: нужно разобраться с принципами вывода в прологе, в том смысле, что кандидаты должны быть сгенерированы каким-то процессом.

    К прочтению The Art of Prolog

    Идея на самом деле проста, нужно написать "генераторы", которые будут давать кандидатов для решения. В коде ниже это списки простых чисел меньше заданного, тогда кандидат -- это просто простое число из списка, выдергивается стандартной функцией member

    Вывод делается вот так
    ?- factorization(143,P1,P2).
    1113
    P1 = 11,
    P2 = 13 .
    
    ?- factorization(25,P1,P2).
    55
    P1 = P2, P2 = 5 .


    Код решения
    divisible(X,Y) :- 0 is X mod Y, !.
    
    divisible(X,Y) :- X > Y+1, divisible(X, Y+1).
    
    is_prime(2) :- true,!.
    is_prime(X) :- X < 2,!,false.
    is_prime(X) :- not(divisible(X, 2)).
    
    factorization(X,P1,P2) :- prime_list(2,X,L), member(P1,L), member(P2,L), is_prime(P1), is_prime(P2), X is P1 * P2.
    
    prime_list(A,B,L) :- A =< 2, !, p_list(2,B,L).
    prime_list(A,B,L) :- A1 is (A // 2) * 2 + 1, p_list(A1,B,L).
    
    p_list(A,B,[]) :- A > B, !.
    p_list(A,B,[A|L]) :- is_prime(A), !, next(A,A1), p_list(A1,B,L). 
    p_list(A,B,L) :-  next(A,A1), p_list(A1,B,L). 
    next(2,3) :- !.  
    next(A,A1) :- A1 is A + 2.
    Ответ написан