Пролог тайна (с, [а, б, в, г], Z) - PullRequest
2 голосов
/ 12 ноября 2009

Я думаю, что ответ 3, но я не уверен, кто-нибудь может помочь?

Предположим, что следующие два утверждения введены в Пролог:

mystery(X,[X|L],L).
mystery(X,[Y|L],[Y|M])  :-  mystery(X,L,M). 

Что бы возвратил Пролог, если бы тогда он поставил перед собой следующую цель?

?- mystery(c,[a,b,c,d],Z).

1 Ответ

6 голосов
/ 12 ноября 2009

Итак, mystery/3 определяется как:

mystery(X, [X|L], L).
mystery(X, [Y|L], [Y|M]) :- mystery(X, L, M).

Есть (как минимум) три способа взглянуть на mystery:

  1. Он принимает элемент X (первый параметр), ищет его существование в заданном списке (второй параметр) и возвращает тот же список, минус один вхождение X ( третий параметр). Таким образом:

    ?- mystery(c, [a, b, c, d], Z).
    Z = [a, b, d] ;
    fail.
    
    ?- mystery(c, [a, b, c, d, c], Z).
    Z = [a, b, d, c] ;
    Z = [a, b, c, d] ;
    fail.
    
  2. Другой способ взглянуть на mystery состоит в том, что он проверяет, отличаются ли списки, составляющие его второй и третий аргументы, только по одному элементу, т.е. что второй список равен третьему списку, за исключением того, что он дополнительный элемент в одном месте. Таким образом:

    ?- mystery(X, [a, b, c, d], [a, b]).
    fail.
    
    ?- mystery(X, [a, b, c, d], [a, b, c]).
    X = d ;
    fail.
    

    Обратите внимание, что порядок важен:

    ?- mystery(X, [a, b, c, d], [a, c, b]).
    fail.
    
  3. Наконец, mystery может также генерировать все способы, которыми первый аргумент может быть перемежен в списке третьего аргумента. Таким образом:

    ?- mystery(d, Y, [a, b, c]).
    Y = [d, a, b, c] ;
    Y = [a, d, b, c] ;
    Y = [a, b, d, c] ;
    Y = [a, b, c, d] ;
    fail.
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...