2013-04-06 4 views
0

Я попытался с помощью кода, подобную этой ссылке:Решите в прологе, что приводит к ошибке?

Solving a textual logic puzzle in Prolog - Find birthday and month

Проблема, которую я пытаюсь решить это за (телефонные разговоры). http://www.cis.upenn.edu/~matuszek/cis554-2012/Assignments/prolog-01-logic-puzzle.html

Мой код:

dated(Date):- 
member(Date,[1928,1929,1932,1935]). 
exchanged(Exchange):- 
member(Exchange,[al,be,pe,sl]). 

solve(X):- 
X=[[gertie,Exchange1,Date1], 
    [herbert,Exchange2,Date2], 
    [miriam,Exchange3,Date3], 
    [wallace,Exchange4,Date4]], 

exchanged(Exchange1), exchanged(Exchange2), exchanged(Exchange3), exchanged(Exchange4), 
Exchange1 \== Exchange2, Exchange1 \== Exchange3, Exchange1 \== Exchange4, 
Exchange2 \== Exchange1, Exchange2 \== Exchange3, Exchange2 \== Exchange4, 
Exchange3 \== Exchange1, Exchange3 \== Exchange2, Exchange3 \== Exchange4, 
Exchange4 \== Exchange1, Exchange4 \== Exchange2, Exchange4 \== Exchange3, 

dated(Date1), dated(Date2), dated(Date3), dated(Date4), 
Date1 \== Date2, Date1 \== Date3, Date1 \== Date4, 
Date2 \== Date1, Date2 \== Date3, Date2 \== Date4, 
Date3 \== Date1, Date3 \== Date2, Date3 \== Date4, 
Date4 \== Date1, Date4 \== Date2, Date4 \== Date3, 

%Herbet's first exchange wasn't for BE 
Exchange2 \== be, 

%The Person whose first exchange was SL wasn't Getie or Herbert 
Exchange1 \== sl, 
Exchange2 \== sl, 

%The person whose first exchange was BE didn't get the phone in 1935 
member([_,be, \+1935], X), 

%The person who got the first phone in 1932 didn't have an exchange for AL or BE 
member([_, \+al, 1932], X), 
member([_, \+be, 1932],X), 

%The person who got the first phone in 1928 had an exchange for PE 
member([_,pe,1929], X), 

%Wallace first exchange was AL 
Exchange4 == al. 

Моя проблема заключается в следующем:

?- solve(X). 
false. 

ответ

1

Итак, ваша проблема, ваш solve предикат не находит каких-либо решений. Это означает, что одно из предпосылок для нахождения решения не удается для всех возможных путей в дереве решений.

Вы на самом деле пытались найти, какой именно? Наверняка нет, иначе вы бы заметили, что это:

member([_,be,\+1935],X) 

всегда терпит неудачу. Зачем? Что такое \+/1? «\+ :Цель истинна, если Цель не может быть доказана». Другими словами, вы не можете использовать \+ для соответствия. Вместо этого вы могли бы написать:

\+ member([_,be,1935),X). 

Так со всеми исправлениями:

?- solve(X). 
X = [[gertie, be, 1928], [herbert, pe, 1929], [miriam, sl, 1932], [wallace, al, 1935]] ; 
false. 

Предполагая, что остальная часть программы является правильным.

Очень плохо использовать stackoverflow как альтернативу отладке вашего кода.

+0

Простите, не зная, как точно отлаживать с помощью SWI пролог. Я совершенно новичок в декларативном программировании! Спасибо за ваш ответ. Да, я тоже попробовал найти его. –

+0

@AlexCutajar Я попытался показать, как я нашел, что не так с вашей программой, чтобы вы могли сделать это сами. И действительно, независимо от языка, проблемы с определением проблем в ваших программах - это то, что вам просто нужно научиться делать. – 2013-04-07 01:11:38

0

Вместо

exchanged(Exchange1), exchanged(Exchange2), exchanged(Exchange3), exchanged(Exchange4), 
Exchange1 \== Exchange2, Exchange1 \== Exchange3, Exchange1 \== Exchange4, 
Exchange2 \== Exchange1, Exchange2 \== Exchange3, Exchange2 \== Exchange4, 
Exchange3 \== Exchange1, Exchange3 \== Exchange2, Exchange3 \== Exchange4, 
Exchange4 \== Exchange1, Exchange4 \== Exchange2, Exchange4 \== Exchange3, 

dated(Date1), dated(Date2), dated(Date3), dated(Date4), 
Date1 \== Date2, Date1 \== Date3, Date1 \== Date4, 
Date2 \== Date1, Date2 \== Date3, Date2 \== Date4, 
Date3 \== Date1, Date3 \== Date2, Date3 \== Date4, 
Date4 \== Date1, Date4 \== Date2, Date4 \== Date3, 

вы можете написать

permutation([al,be,pe,sl], [Exchange1, Exchange2, Exchange3, Exchange4]), 
permutation([1928,1929,1932,1935], [Date1, Date2, Date3, Date4]), 
+0

Спасибо за информацию! –

Смежные вопросы