Программа повторяется в другой строке, чем предполагалось - PullRequest
1 голос
/ 24 мая 2019

У меня есть несколько правил, называемых сессиями, которые имеют заголовок (строка) и темы (список строк). Я создаю запрос, в котором я ввожу некоторые ключевые слова и нахожу, какой сеанс имеет лучшее соответствие. Каждое ключевое слово может иметь вес (за ключевым словом следует -2, например, если вес ключевого слова равен 2, если вес равен 1, то рядом с ключевым словом ничего нет). Моя проблема в рекурсии. Для входов без весов все в порядке, но с весами программа повторяется по-другому.

session('Rules; Semantic Technology; and Cross-Industry Standards',
['XBRL - Extensible Business Reporting Language',
 'MISMO - Mortgage Industry Standards Maintenance Org',
 'FIXatdl - FIX Algorithmic Trading Definition Language',
 'FpML - Financial products Markup Language',
 'HL7 - Health Level 7',
 'Acord - Association for Cooperative Operations Research and Development (Insurance Industry)',
 'Rules for Governance; Risk; and Compliance (GRC); eg; rules for internal audit; SOX compliance; enterprise risk management (ERM); operational risk; etc',
 'Rules and Corporate Actions']).

session('Rule Transformation and Extraction',
['Transformation and extraction with rule standards; such as SBVR; RIF and OCL',
 'Extraction of rules from code',
 'Transformation and extraction in the context of frameworks such as KDM (Knowledge Discovery meta-model)',
 'Extraction of rules from natural language',
 'Transformation or rules from one dialect into another']).

accessList([H|T], H, T).

is_empty_string(String) :-
    String == ''.
not_empty_string(String) :-
    String \== ''.

get_weight_of_token(MyToken, WeightOfToken) :-
    split_string(MyToken,"-","",TempList),  % tokenize MyToken into a list ( [string_of_token, weight_of_token] ) 
    accessList(TempList,_,TempWeight),          %
    accessList(TempWeight,TempWeight2,_),       % accessing the tail of the list (weight_of_token)
    number_string(WeightOfToken,TempWeight2)    % convert string to number

    ;

    WeightOfToken is 1.

find_relevance([], SessionTitle, SessionTopics).
find_relevance([H | T], SessionTitle, SessionTopics) :-
    get_weight_of_token(H, WeightOfToken),
    format('Token = ~w with weight = ~d ~n', [H,WeightOfToken]),
    format('Title = ~w~nTopics = ~w ~n', [SessionTitle,SessionTopics]),
    find_relevance(T, SessionTitle, SessionTopics).

query(ListOfKeywords) :-
    is_empty_string(ListOfKeywords), write('List of keywords is empty!')

    ;

    not_empty_string(ListOfKeywords),
    split_string(ListOfKeywords," ","",KeywordsTokens),     %tokenize string with space as separator
    session(Title,Topics), find_relevance(KeywordsTokens, Title, Topics), fail. 

С вводом без весов, таких как «firword secword», это результат: https://imgur.com/a/Q2fU2IM

Как видите, программа прекрасно работает и вызывает find_revelance для следующего сеанса.

С вводом с весами, такими как «firword-2 secword», это результат: https://imgur.com/xKFpFvh

Как вы можете видеть, программа не возвращается к (9) для следующего сеанса, но возвращается к (10) по какой-то причине ... и особенно к части после; ..

Почему это происходит? Заранее спасибо.

* Я изменил названия и темы на что-то меньшее, чтобы изображения были более четкими

...