Итак, я должен воссоздать небольшую реализацию подсказки игры.Clue game in Prolog
Мне дается набор фактов и выдается список возможных подозреваемых, найденных Прологом. Учитывая единственный факт для «уникального» подозреваемого, программа должна тогда выводить только найденного уникального подозреваемого.
У меня есть вся логика, теперь мне просто трудно понять, как остановить программу от поиска подозреваемых, когда я даю ей «уникальный» подозреваемый факт.
Могу ли я получить небольшую помощь от другого глаза, чтобы узнать, где я иду не так, мое знание начинающего меня озадачило, как заставить это остановить или организовать порезы, чтобы остановить его.
Вот код:
%% Facts
rich(mrBoddy).
affair_with(msGreen, mrBoddy).
affair_with(missScarlet, mrBoddy).
married_to(profPlum, msGreen).
greedy(colMustard).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Rules
affair(X, Y) :- affair_with(X, Y).
affair(X, Y) :- affair_with(Y, X), !.
married(X, Y) :- married_to(X, Y).
married(X, Y) :- married_to(Y, X), !.
greed(X, Victim) :-
greedy(X),
not(rich(X)),
rich(Victim).
hate(X, Victim) :-
married(X, Someone),
affair(Someone, Victim).
murder(X, Victim) :-
hate(X, Victim);
greed(X, Victim).
%%% THIS IS THE UNIQUE SUSPECT FACT--- suspect_found(profPlum).
suspect_found(X) :-
X = profPlum;
X = missScarlet;
X = msGreen;
X = colMustard.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Solution
suspect(Killer, mrBoddy) :-
murder(Killer, mrBoddy),
suspect_found(Killer).
На самом деле это не дает missScarlet и msGreen. Он обнаруживает, что подозреваемые - это profPlum и colMustard, которые просто отличны от моей логики. То, что я пытаюсь заставить это сделать сейчас, просто отображает единственного подозреваемого, когда я раскомментирую факт suspect_found/1. Это моя единственная проблема –
Мой ответ правильный: – migfilg
(продолжение) Я описал поведение 'suspect_found/1', как указано в предложении uncommented, а не то, что дает' suspect/1'. Разоргая предыдущее предложение, 'suspect_found/1' дает все имена, повторяя' profPlum', а 'suspect/1' дает' profPlum' дважды и 'colMustard'. Сохранение только 1-го предложения 'подозреваемый/1' дает' profPlum' один раз. Чтобы получить только первый ответ, даже если есть больше, либо не используйте обратный отсчет на 'подозреваемый/1', либо добавьте разрез в конце своего предложения. Так как предикат 'suspect_found/1' принимает только ответы, отфильтровывающие другие. Надеюсь, теперь это ясно. – migfilg