edit: Я разобрался с одноэлементными переменными. Пролог не любит заглавные слова для банков данных. Я также внес несколько серьезных изменений в код.
edit: edit: понял, что у меня нет рекурсивного вызова. Дерп
Я новичок в Prolog, хотя у меня есть некоторый опыт функционального программирования на Haskell.
Хотя у меня возникают проблемы с попыткой заставить функцию выводить все возможные значения, которые делают утверждение истинным. Я не думаю, что это логическая ошибка, поскольку я проходил через это последние несколько часов, но могу ошибаться.
В этой задаче я пытаюсь создать историю владения автомобилем.
- Я знаю, что человек владеет автомобилем, ЕСЛИ -Он / Она купила машину у Дилера -Он / Она купила ее у предыдущего владельца машины.
Итак, зная эти факты, я создал банк данных, в котором были созданы автомобили, владельцы и отдельная переменная дилера, которая будет выступать в качестве базового случая в этой рекурсии.
car(prius).
car(bmw).
owner(meg).
owner(nora).
dealer(d).
boughtFrom(meg,nora).
boughtFrom(nora,d).
Установил, что мег куплен у нора, который покупал у дилера. Когда вы покупаете у дилера, рекурсия, которую я планирую, останавливается, поскольку это конечная точка базового случая. поэтому логика такая:
ownCar(X,Y) :- boughtFrom(X,d), car(Y).
ownCar(X,Y) :- ownCar(boughtFrom(_,prevowner(X)), car(Y)).
Вы можете быть владельцем автомобиля, если вы являетесь дилером или купили автомобиль у предыдущего владельца. и этот предыдущий владелец является владельцем, если они купили его либо у дилера, либо у другого предыдущего владельца. и т.п.