Применить предикат к списку входов Пролог - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать следующее:

Учитывая список символов, чтобы узнать, какой список лучше всего ему противоречит, поэтому изображение, которое я помещаю в список [kraken,scorpia,zulrah], чтобы он проверил тип атаки Каждый из них будет наиболее эффективным типом атаки для каждого, и с этим я бы получил список из 3 боссов.

% boss(Name, Type) Name = Name of boss, Type = Attack type
boss(kraken,magic).
boss(scorpia,melee).
boss(zulrah,ranged).
boss(cerberus,melee).
boss(abyssal_sire,melee).
boss(obor,melee).
boss(sarachnis,ranged).
boss(skotizo,melee).
boss(venenatis,magic).

superEffective(magic,melee). %magic is more effective against melee
superEffective(ranged,magic). %ranged is more effective against magic
superEffective(melee,ranged). %melee is more effective against ranged

1 Ответ

1 голос
/ 26 мая 2020

Сначала , создайте предикат для проверки счетчика одного Босса:

verify_con(Boss, ConBoss) :- boss(Boss,MainSkill), 
                             superEffective(MainSkill,ConSkill), 
                             boss(ConBoss,ConSkill), !.

Обратите внимание, что этот предикат всегда будет первым лучшим счетчиком для входной босс. Если вам нужны все возможные комбинации, просто удалите , ! в конце.

Второй , используйте рекурсию для перебора входного списка и создания выходного списка. Вы можете использовать append/3 для добавления выходного массива.

verify_con_list([],[]).
verify_con_list([H|T], LIST) :- verify_con(H, ConBoss), 
                                verify_con_list(T, L1), 
                                append([ConBoss],L1, LIST).

При необходимости вы можете определить функцию append/3 в верхней части кода следующим образом:

append([], X, X).
append([H|T], X, [H|S]) :- append(T, X, S).

Примеры

Одиночный вывод:

?- verify_con(kraken, A).

A = scorpia 

Ввод списка:

?- verify_con_list([kraken, scorpia, zulrah], Con).

Con = [scorpia, zulrah, kraken]

Полный код:

append( [], X, X).                        
append( [X | Y], Z, [X | W]) :- append( Y, Z, W).  

% boss(Name, Type) Name = Name of boss, Type = Attack type
boss(kraken,magic).
boss(scorpia,melee).
boss(zulrah,ranged).
boss(cerberus,melee).
boss(abyssal_sire,melee).
boss(obor,melee).
boss(sarachnis,ranged).
boss(skotizo,melee).
boss(venenatis,magic).

superEffective(magic,melee). %magic is more effective against melee
superEffective(ranged,magic). %ranged is more effective against magic
superEffective(melee,ranged). %melee is more effective against ranged

verify_con(Boss, ConBoss) :- boss(Boss,MainSkill), 
                             superEffective(MainSkill,ConSkill), 
                             boss(ConBoss,ConSkill), !.

verify_con_list([],[]).
verify_con_list([H|T], LIST) :- verify_con(H, ConBoss), 
                                verify_con_list(T, L1), 
                                append([ConBoss],L1, LIST).



%verify_con(kraken, A).
%verify_con_list([kraken, scorpia, zulrah], Con).
...