Добавить, возвращая false - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующее правило в прологе, где каждая константа в формуле (константа определяется как c (a)) добавляется в список констант, однако мой оператор добавления постоянно возвращает false.

getCONSTs( tt, []).
getCONSTs( ff, []).
getCONSTs( c(C), [C]).
getCONSTs( and(Q1, Q2), ListConstants) :-
   append(getCONSTs(Q1,A1),getCONSTs(Q2,A2),L1).

В приведенном выше операторе добавления, если я дам правилу запрос, такой как:

?- getCONSTs(and(c(A),c(B)),[]).

Оператор добавления должен составить список констант: [A,B]

1 Ответ

0 голосов
/ 04 декабря 2018

То, что вы здесь хотите сделать, это вызвать 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].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...