Отрицание отсутствующего факта в прологе

#prolog

Вопрос:

допустим, у меня есть;

 goal(A,B) :- goal1(A,C),   goal2(C,B).
 

но теперь, скажем goal(c,b) , нельзя сделать вывод.

Если я запрошу, goal(c,b) то получу истину, но если я запрошу goal(a,B) , то не получу B=b , потому что это даже не проверяется goal2(c,b) (поскольку это невозможно вывести). Он просто проверяет все имеющиеся факты goal2(C,B) и выбирает только те, которые являются ложными.

Вот в этом-то и проблема. Я хочу, чтобы B=b в качестве ответа, когда я спрашиваю что-то вроде goal(a,B) . Возможно ли это в прологе. Обратите внимание, что я не хочу вставлять отрицательный факт, как goal(c,b):-false в прологе.

Спасибо.

Комментарии:

1. Не могли бы вы попытаться привести рабочий пример? Например, приведите примеры определений для целей 1/2 и 2/2, а также запросов, которые вы хотите использовать.

2. Хорошо, более простой пример @TA_intern : — У нас может быть определенное отношение «отец/2», несколько фактов. Тогда я хочу знать всех людей, чей отец не «а». Так что-то вроде ? -не отец(а,Х). Тогда я думаю, что задача состоит в том, чтобы определить не father/2. Потому что,если я определю не отца(A, B) :- отец(A,B). возникает та же проблема

3. В принципе, если есть способ, пролог заменяет все константы, определенные в базе данных, в правило отрицания для проверки, вместо того, чтобы использовать только существующие выведенные правила для проверки. Тогда это может сработать. Я думаю, теперь вы знаете, в чем проблема.

4. Не могли бы вы написать это в вопросе? Действительно трудно понять код, который я не могу скопировать, вставить и запустить на своем компьютере.

Ответ №1:

Пытаясь угадать из вашего вопроса, скажем, что у нас есть:

 p(a, 1).
p(c, 2).
p(d, 1).
p(e, 2).
 

и вы хотели запросить все p/2, где второй аргумент не равен 2, вы можете либо сделать:

 ?- p(X, Y), Y == 2.
 

или:

 ?- dif(Y, 2), p(X, Y).
 

Прочитайте документы, чтобы понять, в чем разница. Здесь есть много вопросов, так что обсудите это.

Комментарии:

1. Эй, кажется, это работает для меня:). Спасибо. Поэтому идея в том, что если я хочу проверить «все константы», определенные в базе данных, они должны быть в каком-то факте. Затем я хочу использовать эти факты для проверки этой константы.

2. @Tojrah, я не знаю. Мне действительно трудно понять без примеров кода 🙁