У меня есть несколько правил, называемых сессиями, которые имеют заголовок (строка) и темы (список строк). Я создаю запрос, в котором я ввожу некоторые ключевые слова и нахожу, какой сеанс имеет лучшее соответствие. Каждое ключевое слово может иметь вес (за ключевым словом следует -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) по какой-то причине ... и особенно к части после; ..
Почему это происходит? Заранее спасибо.
* Я изменил названия и темы на что-то меньшее, чтобы изображения были более четкими