2013-08-17 3 views
2

Я сейчас пытаюсь немного узнать Пролог. В качестве упражнения я пытаюсь решить следующую загадку:Prolog - пытается решить текстовую головоломку

Эти правила даны:

*Every person that has neither a car nor a plane, has a bike. 
*Every person that doesn't have a plane but has a bike, has a car 
*Every person that doesn't have a plane but has a car, has a truck 
*Every person that doesn't have a truck but has a boat, doesn't have a plane 
*Every person that doesn't have a boat but has a plane, doesn't have a car 

Теперь есть четыре человека:

*Person1 doesn't have a car but has a boat 
*Person2 doesn't have a boat but has a plane 
*Person3 doesn't have a plane but has a bike 
*Person4 doesn't have a bike but has a car 

Какой человек не имеет грузовик?

То, что я придумал до сих пор это:

doesnthave(car,pa). 
has(boat,pa). 
doesnthave(boat,pb). 
has(plane,pb). 
doesnthave(plane,pc). 
has(bike,pc). 
doesnthave(bike,pd). 
has(car,pd). 

has(bike,X) :- doesnthave(car,X),doesnthave(plane,X). 
has(car,X) :- doesnthave(plane,X),has(bike,X). 
has(truck,X) :- doesnthave(plane,X),has(car,X). 
doesnthave(plane,X) :- doesnthave(truck,X),has(boat,X). 
doesnthave(car,X) :- doesnthave(boat,X),has(plane,X). 

Теперь это, кажется, не достаточно. Или это не способ решения таких головоломок в прологе?

Редактировать: Кажется, первые два утверждения противоречивы. Вместе они уступают: у каждого человека, у которого нет ни машины, ни самолета, есть машина. Я не уверен, есть ли разумное решение этого.

ответ

3

не уверен в этом решении, но более простое представление знаний, безусловно, помогает:

has(car, pa, n). has(boat, pa, y). 
has(boat, pb, n). has(plane, pb, y). 
has(plane, pc, n). has(bike, pc, y). 
has(bike, pd, n). has(car, pd, y). 

has(bike, X, y) :- has(car, X, n), has(plane, X, n). 
has(car, X, y) :- has(plane, X, n), has(bike, X, y). 
has(truck, X, y) :- has(plane, X, n), has(car, X, y). 
has(plane, X, n) :- has(truck, X, n), has(boat, X, y). 
has(car, X, n) :- has(boat, X, n), has(plane, X, y). 

теперь мы можем запросить то, что в домовладения (то обратите внимание, что это один ко многим отношения)

?- setof((P,T,R), has(T,P,R), L), maplist(writeln, L). 
pa,boat,y 
pa,car,n 
pb,boat,n 
pb,car,n 
pb,plane,y 
pc,bike,y 
pc,car,y 
pc,plane,n 
pc,truck,y 
pd,bike,n 
pd,car,y 
L = [ (pa, boat, y), (pa, car, n), (pb, boat, n), (pb, car, n), (pb, plane, y), (pc, bike, y), (pc, car, y), (pc, ..., ...), (..., ...)|...]. 

Примечание. Я разместил P ерсон до T ransport, затем мы можем визуально проверить результат ...

Кажется, что t он является тройным ...

+0

Как оказалось, в первых двух утверждениях есть противоречие. Вместе они дают: у каждого человека, у которого нет ни машины, ни самолета, есть машина. – tschaei