Пролог, пол с if_then_else
Я хотел бы сказать, что если он отец, он мужчина, а женщина
father(pedro-i,beatriz(1347)).
father(pedro-i,joão(1349)).
father(pedro-i,dinis(1354)).
father(pedro-i,joão_grão_mestre_da_ordem_de_avis).
mother(constança(1320),luis).
mother(constança(1320),maria(1342)).
% I want to say that if is the father then is male else is a female
IF_then_else(X,Y,Z) :- father(X,Y),male.
IF_then_else(X,Y,Z) :- female.
1 ответ
Первое замечание: предикаты и функторы начинаются со строчной буквы, а не с заглавной: заглавные используются для переменных.
Кажется, вы упускаете момент, когда предикаты в Прологе не возвращают значение. Они могут только преуспеть или потерпеть неудачу (в этом смысле они "возвращают" логическое значение). Способ обеспечить (не булево) вывод - использовать унификацию.
Здесь вы можете сделать это, поместив литерал в голову, например:
if_then_else(X,Y,male) :- father(X,Y).
if_then_else(X,Y,female).
Но теперь есть еще одна проблема: пролог возвращается. Таким образом, это означает, что даже если первое предложение выполнится успешно, оно попытается использовать второе предложение. Так pedro-i
оба будут male
а также female
, Вы можете решить эту проблему, добавив второй пункт, который гласит, что этот пункт успешно выполняется, если Пролог не может доказать, что существует father(X,Y)
связь. Что-то вроде:
if_then_else(X,Y,male) :- father(X,Y).
if_then_else(X,Y,female) :- \+ father(X,Y).
Но это может привести к вычислительно-дорогой проблеме: возможно, потребуется много времени, чтобы доказать, что существует father(X,Y).
отношение, и если такого отношения не существует, не доказательство этого займет еще больше времени (потому что Пролог должен проверить все ветви). Это может даже привести к бесконечному циклу. В этом случае вы можете использовать разрез (!
). Если вы достигнете разреза, Prolog не будет пытаться найти результаты в следующих пунктах предиката. Таким образом, вы можете написать:
if_then_else(X,Y,male) :- father(X,Y), !.
if_then_else(X,Y,female).
В качестве альтернативы вы можете использовать структуру Пролога if-then-else и использовать явное объединение:
if_then_else(X,Y,Z) :-
( father(X,Y)
-> Z = male
; Z = female
).