То, что вы здесь хотите сделать, это вызвать append/3
с первыми двумя параметрами с терминами getCONSTs/2
, так что это списки , а не .Конечно, существует предикат с тем же именем, но учтите, что даже если Пролог вызовет предикат, он может только возвратить true
или false
(или вызвать ошибку, или застрять в бесконечностипетля).Но даже вызова предиката не происходит: вы создаете термин, и это более «совпадение», что существует предикат с тем же именем.
В Прологе значения передаются с помощью , объединяющим переменные со значениями, а затем вызов другого предиката с этой переменной, например:
getCONSTs(and(Q1, Q2), <b>L</b>) :-
getCONSTs(Q1, <b>A1</b>),
getCONSTs(Q2, <b>A2</b>),
append(<b>A1</b>, <b>A2</b>, <b>L</b>).
Обратите внимание, что вызов с:
?- getCONSTs(and(c(A),c(B)), []).
false.
по-прежнему приводит к false
, поскольку здесь вы в основномзапрос, если " Является ли getConsts and(c(A), c(B))
равным []
? ".Чтобы создать список, вы должны снова использовать переменную, например:
?- getCONSTs(and(c(A),c(B)), <b>L</b>).
<b>L =</b> [A, B].