Вы все еще думаете о функциях
z = f(x,y)
: "f (x, y) возвращает (заменяется на / сокращается до) значение z ..."
Предикаты связывают значения с другими значениями:
p_f(x,y,z)
: "предикат p_ создает значения отношения / соединения / связей (x, y, z) такой, что z = f (x, y) "
Таким образом, к оценке конвейера (математическая запись (g ° f) (x, y) )
g(f(x,y))
Вы должны написать (не принимая во внимание соглашение Пролога, что здесь «переменные» пишутся в верхнем регистре):
p_f(x,y,a),p_g(a,b)
И думать с точки зрения информация, поступающая в это выражение через p_f(x,y,_)
, передаваемая в p_g/2
через p_f(_,_,a), p_g(a,_)
и вытекающая из выражения через p_g(a,b)
.
И p_f / 3 или p_g / 2 прекратит сбой (вернет false, не в любом из своих аргументов, но в целом), если они не смогут связать свои аргументы и результата не будет.
Использование предикатов имеет объявление что для p_f (x, y) вы можете запросить x , если известно y , y , если x известно, или пары действительных (x, y) (при условии, что это возможно в вычислительном отношении, и предикат был правильно закодирован). Или для предиката add/3
:
- add (2,3, X) -> X = 5
- add (2,3,5) -> true
- add (X, 3,5) -> X = 2
- add (1,3,5) -> false
- add (X, Y, 5) -> X = 2, Y = 3; Х = 3, Y = 2; ... до бесконечности
- добавить (X, Y, Z) -> то же, что и выше, только еще более безудержно
См. также: Пролог ~ Разделение числа в список