理解prolog中的递归调用逻辑

时间:2014-10-31 08:06:56

标签: prolog

我有嵌套函数调用对父函数进行递归调用的情况。

在下面的代码rule_four_question中,函数再次调用linkage。所以我期待的是linkage的所有事实都应该再次考虑。

伪代码:

sentence(LINK,LINKSTART,LINKEND)
{
if(LINK == 'Xx')
    //that mean sentence has two subsentences.
    //Now check both sentence. The sentence having link == `Wq` that is question based sent
    //So identifying whether subsentences are question or not
else
    //Sentence is single query
}

}

我想做什么。 if link = Wq or Ws or W*然后asign rule one

如果link = Xx那么我们有两个句子,所以现在需要检查两个句子中的链接。如果子级链接的REND为父级< REND且条件匹配,则为three并检查rule four

ISsue是。

linkage的嵌套呼叫未在标头中提及或facts。嵌套调用仅考虑Ws而非Wq

linkage('Ws', 2, 3, 'false', 'false', 'false', 'false', 'false','false').
linkage('Xx', 1, 9, 'false', 'false', 'false', 'false', 'false','false').
linkage('Wq', 10, 13, 'false', 'false', 'false', 'false', 'false','false').
/*
linkage('Ws', '2', '3', 'false', 'false', 'false', 'false', 'false','false').
linkage('Cv', '4', '6', 'false', 'false', 'false', 'false', 'false','false').
*/

rule_first_question(LINK, LEND, REND):-
(
    (
        member(LINK, ['Xx']),
        nb_linkval(rule, 'two')
    )
    ; (
        nb_linkval(rule, 'one')
    )
).

rule_four_question(LINK, LEND, REND, ISMULTIPLE, LINKONE, LINKTWO, LINKONEISQUERY, LINKTWOISQUERY,R):-
(
    writeln('parent'),
    writeln(LINK),
    (
        linkage(LINK2, LEND2, REND2, ISMULTIPLE2, LINKONE2, LINKTWO2, LINKONEISQUERY2, LINKTWOISQUERY2,R2) ->
                (
                    writeln('child'),
                    writeln(LINK2),
                    REND > REND2 ->
                    (
                        write('First sentence is query'),
                        member(LINK, ['Wq']),
                        nb_linkval(rule, 'three')
                    )
                    ; (
                        member(LINK, ['Wj']),
                        nb_linkval(rule, 'three')
                    )
                    ; (
                        member(LINK, ['Ws']),
                        nb_linkval(rule, 'three')
                    )
                    ; (
                        member(LINK, ['Qd']),
                        nb_linkval(rule, 'three')
                    ),
                        (
                            REND < REND2 ->
                            (
                                write('SEcond sentence is query'),
                                member(LINK, ['Wq']),
                                nb_linkval(rule, 'four')
                            )
                            ; (
                                member(LINK, ['Wj']),
                                nb_linkval(rule, 'four')
                            )
                            ; (
                                member(LINK, ['Ws']),
                                nb_linkval(rule, 'four')
                            )
                            ; (
                                member(LINK, ['Qd']),
                                nb_linkval(rule, 'four')
                            );
                            nb_linkval(rule, 'two')
                        )

               )
    )
).

/*
if rule three then say first sentence is quetion, 2nd not
if rule four then say both sentence are question
if rule two then say none of sentence
if rule one then say only one sentence and that is the query
*/
question(LINK, LEND, REND , ISMULTIPLE, LINKONE, LINKTWO, LINKONEISQUERY, LINKTWOISQUERY,RULE):-
    linkage(LINK, LEND, REND, ISMULTIPLE, LINKONE, LINKTWO, LINKONEISQUERY, LINKTWOISQUERY,R),
    (
        (
            rule_first_question(LINK, LEND, REND) ->
            nb_getval(rule, RULE),
            (
                RULE = 'one' ->
                    writeln('\n'),
                    writeln(LINK),
                    writeln(RULE)
                ;
                    (
                        RULE = 'two' ->
                            writeln('\n'),
                            writeln(LINK),
                            writeln(RULE),
                            rule_four_question(LINK, LEND, REND, ISMULTIPLE, LINKONE, LINKTWO, LINKONEISQUERY, LINKTWOISQUERY,R) ->
                                nb_getval(rule, RULE),
                                writeln(RULE)
                        ;
                        writeln('nothing')
                    )
            )
        )
    ).

输出:

1 ?- question(LINK, LEND, REND , ISMULTIPLE, LINKONE, LINKTWO, LINKONEISQUERY, LINKTWOISQUERY,RULE).


Ws
one
LINK = 'Ws',
LEND = 2,
REND = 3,
ISMULTIPLE = LINKONE, LINKONE = LINKTWO, LINKTWO = LINKONEISQUERY, LINKONEISQUERY = LINKTWOISQUERY, LINKTWOISQUERY = false,
RULE = one ;


Xx
two
parent
Xx
child
Ws
First sentence is query #here next I expect answer for second sentence too, that is not coming

Wq
one
LINK = 'Wq',
LEND = 10,
REND = 13,
ISMULTIPLE = LINKONE, LINKONE = LINKTWO, LINKTWO = LINKONEISQUERY, LINKONEISQUERY = LINKTWOISQUERY, LINKTWOISQUERY = false,
RULE = one.

0 个答案:

没有答案