DCG в SWI-Prolog

      Комментарии к записи DCG в SWI-Prolog отключены

Помечено: , ,

В этой теме 4 ответа, 2 участника, последнее обновление  aleator 1 год, 6 мес. назад.

  • Автор
    Сообщения
  • #2466

    aleator
    Участник

    Моя программа:

    % 	top([did, mark, hamill, play, spock]). 
    % 	top([did, william, shatner, play, luke, skywalker]).
    % 	top([did, william, shatner, direct, star, wars, i]).
    top(Sentence):-
    	yesno(Query, Sentence, []),
    	(Query,
    	write("Yes, that's true");write("Sorry, no")).
    	
    % 	top([what, is, the, title, of, star, wars, ii]).	
    top(Sentence):-
    	what(What, Sentence, []), 
    	write("The title you're looking for is "),	
    	write(What).
    	
    top(_):- write("I don't get it").	
    % ********************************
    yesno(Sem) --> [did], statement(_^_^[Sem]).
    
    what(X) --> [what, is, the], verb_phrase(X^_^[What]), {What}.
    % ********************************
    statement(Subj^Obj^Sem) --> 
        noun_phrase(Subj),
        verb_phrase(Subj^Obj^Sem).
     
    noun_phrase(Sem) --> proper_noun(Sem).
     
    verb_phrase(Subj^Obj^Sem) -->
       verb(Subj^Obj^Sem),
       noun_phrase(Obj).
    
    verb(X^Y^[actor_for(X,Y)]) --> [play]. 
    verb(X^Y^[title_of(X,Y)]) --> [title, of].
    verb(X^Y^[director_of(X,Y)]) --> [direct].
    % ********************************	
    actor(mark_hamill).
    actor(william_shatner). 
    actor(liam_neeson).
    actor(leonard_nimoy). 
     
    title(revenge_of_the_sith).
    title(attack_of_the_clones).
    title(the_phantom_menace). 
    
    director(richard_marquand).
    director(irvin_kershner).
    director(george_lucas).
    
    actor_for(leonard_nimoy,spock). 
    actor_for(william_shatner,luke_skywalker).
    
    title_of(revenge_of_the_sith, star_wars3).
    title_of(attack_of_the_clones, star_wars2).
    title_of(the_phantom_menace, star_wars1).
    
    director_of(richard_marquand, star_wars6).
    director_of(irvin_kershner, star_wars5).
    director_of(george_lucas, star_wars4).
    director_of(george_lucas, star_wars3).
    director_of(george_lucas, star_wars2).
    director_of(george_lucas, star_wars1).
    
    proper_noun(mark_hamill) --> [mark, hamill].
    proper_noun(spock) --> [spock].
    proper_noun(william_shatner) --> [william, shatner].
    proper_noun(luke_skywalker) --> [luke, skywalker].
    proper_noun(leonard_nimoy) --> [leonard, nimoy].
    
    proper_noun(revenge_of_the_sith) --> [revenge, of, the, sith].
    proper_noun(attack_of_the_clones) --> [attack, of, the, clones].
    proper_noun(the_phantom_menace) --> [the, phantom, menace].
    
    proper_noun(richard_marquand) --> [richard, marquand].
    proper_noun(irvin_kershner) --> [irvin, kershner].
    proper_noun(george_lucas) --> [george, lucas].
    
    proper_noun(star_wars7) --> [star, wars, vii].
    proper_noun(star_wars6) --> [star, wars, vi].
    proper_noun(star_wars5) --> [star, wars, v].
    proper_noun(star_wars4) --> [star, wars, iv]. 
    proper_noun(star_wars3) --> [star, wars, iii].
    proper_noun(star_wars2) --> [star, wars, ii].
    proper_noun(star_wars1) --> [star, wars, i].

    Часть вопросов я разработал (здесь только 2, просто они однотипные и справился сам). С остальными — сложности.
    1. Вот этот код для меня не понятен:

    yesno(Sem) --> [did], statement(_^_^[Sem]).
    ...
    statement(Subj^Obj^Sem) --> 
        noun_phrase(Subj),
        verb_phrase(Subj^Obj^Sem).

    В yesno мы закидываем наш вопрос. В statement передаются такие параметры:(_^_^[Sem]). Что конкретно попадает в noun_phrase, verb_phrase? Я понимаю, что noun_phrase и verb_phrase предназначены для обработки именной группы и следующей за ней глагольной группы. Но явно они не передаются? Пролог сам находит и подставляет эти группы в переменные?
    2. Не получается написать предикат для обработки вопросов:

    top([did, mark, hamill, play, spock, in, star, trek, iii]).
    top([is, it, true, that, william, shatner, is, an, actor]).

    3. Не получается написать предикат для обработки вопросов произвольного уровня вложенности (что то вроде для [H|T]).
    Например: top([william, shatner, is, a, director, mark, hamill, is, an, actor, and, leonard, nimoy, is, an, actor, right]).

  • #2467

    Опишите какую задачу решает программа и каким образом работает часть, которая Вам понятна.

  • #2468

    aleator
    Участник

    Всё просто. Задаём вопрос по базе данных, программа отвечает на него. Выводит ответ, или Да/Нет.
    В записях типа verb(X^Y^[actor_for(X,Y)]) --> [play] содержиться глагольная группа, по которой мы и ищем в БД значения.
    Для меня главной сложностью является то, что я не понимаю правила по которому происходит разбор вопроса. В одних случаях мы вызываем statement — если вопрос содержит именную группу и глагольную группу. В других — только глагольную группу.

    % для вопроса top([is, it, true, that, william, shatner, is, an, actor]).
    
    top(Sentence):-
    	yesno3(Query, Sentence, []),
    	(Query,
    	write("Yes, that's true");write("Sorry, no")).	
    
    yesno3(X) --> [is, it, true, that], statement(_^_^[Sem]),[right].
    
    statement(Subj^Obj^Sem) --> 
        noun_phrase(Subj),
        verb_phrase(Subj^Obj^Sem).
     
    noun_phrase(Sem) --> proper_noun(Sem).
     
    verb_phrase(Subj^Obj^Sem) -->
       verb(Subj^Obj^Sem),
       noun_phrase(Obj).
    
    verb(X^Y^[actor_for(X,Y)]) --> [is, an, actor].
    
    

    Данный код для этого вопроса у меня не работает вообще.

    • #2477

      Пытался помочь, но тоже не понимаю что должно происходить в Вашем коде. С другой стороны, я просмотрел несколько статей по DCG в SWI Prolog и вопросов по коду в них у меня не возникло.

      Подскажите какую задачу вам надо решить — может быть мы вместе попытаемся сделать это своими руками (без использования стороннего, непонятного кода)?

  • #2542

    aleator
    Участник

    % top([is, it, true, that, william, shatner, is, an, actor]).
    
    top(Sentence):-
    	yesno4(ListQuery, Sentence, []),
    	(findall( Query, (member(Query, ListQuery), Query), Goals ),
    		ListQuery = Goals,
          write("Yes, thats true")
    		; write("Sorry, no")
        ).
    
    yesno4(Sem) -->  [is, it, true, that], statementN(_^_^[Sem]).
    
    % ------------------------------------------------------------------
    
    % вопросы произвольного уровня вложенности
    
    top(Sentence):-
        yesno5(ListQuery, Sentence, []),
    	(findall( Query, (member(Query, ListQuery), Query), Goals ),
    		ListQuery = Goals,
          write("Yes, thats true")
    		; write("Sorry, no")
        ).
    
    yesno5(Sem) -->  statementN(_^_^Sem),[right].
    
    statementN(Subj1^Obj1^Sem1) -->
       noun_phrase(Subj1),
       verb_phrase(Subj1^Obj1^Sem1),[and],
       statement(_^_^Sem2),
       {append(Sem1,Sem2,_)}.
    statementN(Subj1^Obj1^Sem1) -->
       noun_phrase(Subj1),
       verb_phrase(Subj1^Obj1^Sem1),
       statementN(_^_^Sem2),
       {append(Sem1,Sem2,_)}.

    Тему можно закрывать.

Для ответа в этой теме необходимо авторизоваться.