2013-12-09 2 views
-1

Я работаю над Prolog, и я наткнулся на нижеприведенную программу. Когда я запускаю эту программу с запросом, например: mysterious([2,3,4,5,6,7,8],L). Он дал мне ответ 20. Я не понял поток получения этого результата. может ли кто-нибудь помочь мне понять этот код? ... Как он дает ответ 20 для вышеупомянутого запроса?Объясните, что делает эта программа пролога?

mysterious([],0). 
mysterious([X],X). 
mysterious([X,Y|Xs], Res) :- 
    mysterious(Xs, Res1), 
    Res is X + Res1. 
+3

Почему бы вам не попытаться проследить выполнение? Вызовите '? - trace.', а затем снова запустите запрос, пройдя через него. –

+0

Также попробуйте спросить 'таинственный ([], L)', 'mysterious ([8], L)', 'таинственный ([7,8], L)', 'таинственный ([6,7,8], L) и т. Д. – SQB

ответ

3

Поскольку это такая основная программа, я дам вам подсказку. Во-первых, это:

foo([]). 
foo([X]). 
foo([X,Y|Rest]) :- 
    foo(Rest). 

можно также записать в виде:

foo([]). 
foo([First|Rest]) :- 
    bar(Rest, First). 

bar([], Last). 
bar([This|Rest], Prev) :- 
    foo(Rest). 

Это излишне многословным, но более четко. В вашем случае, однако, он делает что-то очевидное:

mysterious([], 0). 
mysterious([X|Rest], Result) :- 
    myst_1(Rest, X, Result). 

myst_1([], Result, Result). 
myst_1([_Y|Rest], X, Result) :- 
    mysterious(Rest, Result1), 
    Result is X + Result1. 

Нечто, что вы не упомянули в своем вопросе является то, что компилятор должен дать вам «синглтон переменную» предупреждение о Y в последнем предложении от mysterious/2. Это должно было быть убедительным доказательством того, что происходит уже.

+0

@WillNess Исходный предикат в вопросе также не является детерминированным для наиболее распространенных реализаций Prolog. Постскриптум Наконец я понял, что вы имеете в виду, что первый и второй фрагменты не совпадают. Спасибо! –

+0

@WillNess Примечание для себя: сначала подумайте, затем поговорите (про себя), затем напишите. Я оставлю исправленный ответ, но я не думаю, что это вообще полезно. Однако ваши комментарии были полезны, по крайней мере для меня. –

+0

Я был уверен, что где-то сказал «фрагмент кода», а затем повторил его без первого слова. Теперь я этого не вижу; просто «фрагмент» действительно может быть неясным. Простите за это. :) –

2

Я могу помочь вам, комментируя строки, может быть, вы поймете пролог немного больше, давайте начнем:

программа Prolog описывает отношения, определяемые с помощью статей. Pure Prolog ограничивается предложениями Хорна. Существуют два типа статей: факты и правила. (По википедии)

% comment in prolog starts with '%' 
mysterious([],0). % its called 'predicate', something like functions in imperative 
        % languages. it has two arguments: [], and 0. and it is ended 
        % by dot (.). Clauses with empty bodies are called facts. 
        % (this is fact). 

mysterious([X],X). % is actually a "rule" that says, "if the list has one element, 
        % then the result is just that element". (by @mbratch) 

mysterious([X,Y|Xs], Res) :- % now, when argument 1 is list which looks like 
          % [SomeElement, NextElement|LastElements], 
    mysterious(Xs, Res1),  % call 'mysterious' with only LastElements 
          % and variable Res1 (skip first two elements of list) 
    Res is X + Res1.   % then add first element to Res1. 

% it calculates the sum of every second element of list, beginning on first. 
+0

Спасибо @Paul Dew за вас объяснение. оценили !! – rips

+1

если вопрос уже ответил, вы можете его принять;) http://stackoverflow.com/help/accepted-answer –

+0

yay, мой плохой, отредактированный. –

Смежные вопросы