2015-04-11 5 views
1

Итак, я должен воссоздать небольшую реализацию подсказки игры.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). 

ответ

1

Очевидно, что suspect_found/1 предикат имеет несколько решений (из-за использования запятой ; в его теле), и что он не использует какие-либо другие предикаты (правила и факты) в вашей программе. Поэтому естественным является первый ответ от него: profPlum, а также обратный отсчет также дает missScarlet, msGreen и colMustard.

+0

На самом деле это не дает missScarlet и msGreen. Он обнаруживает, что подозреваемые - это profPlum и colMustard, которые просто отличны от моей логики. То, что я пытаюсь заставить это сделать сейчас, просто отображает единственного подозреваемого, когда я раскомментирую факт suspect_found/1. Это моя единственная проблема –

+0

Мой ответ правильный: – migfilg

+0

(продолжение) Я описал поведение 'suspect_found/1', как указано в предложении uncommented, а не то, что дает' suspect/1'. Разоргая предыдущее предложение, 'suspect_found/1' дает все имена, повторяя' profPlum', а 'suspect/1' дает' profPlum' дважды и 'colMustard'. Сохранение только 1-го предложения 'подозреваемый/1' дает' profPlum' один раз. Чтобы получить только первый ответ, даже если есть больше, либо не используйте обратный отсчет на 'подозреваемый/1', либо добавьте разрез в конце своего предложения. Так как предикат 'suspect_found/1' принимает только ответы, отфильтровывающие другие. Надеюсь, теперь это ясно. – migfilg