Рекурсивный запрос, который проверяет, существует ли X в базе данных Prolog - PullRequest
2 голосов
/ 05 мая 2020

Я пытаюсь создать запрос exists(X), который возвращает истину, если X существует в базе данных пролога.

База данных пролога

store(best_smoothies, [alan,john,mary],
      [ smoothie(berry, [orange, blueberry, strawberry], 2),
        smoothie(tropical, [orange, banana, mango, guava], 3),
        smoothie(blue, [banana, blueberry], 3) ]).
store(all_smoothies, [keith,mary],
      [ smoothie(pinacolada, [orange, pineapple, coconut], 2),
        smoothie(green, [orange, banana, kiwi], 5),
        smoothie(purple, [orange, blueberry, strawberry], 2),
        smoothie(smooth, [orange, banana, mango],1) ]).
store(smoothies_galore, [heath,john,michelle],
      [ smoothie(combo1, [strawberry, orange, banana], 2),
        smoothie(combo2, [banana, orange], 5),
        smoothie(combo3, [orange, peach, banana], 2),
        smoothie(combo4, [guava, mango, papaya, orange],1),
        smoothie(combo5, [grapefruit, banana, pear],1) ]).

Моя попытка

exists(X) :- store(_,_,S), isIn(X,S).

isIn(X, [smoothie(X,_,_)|[]]).
isIn(X, [smoothie(N,_,_)|T]) :- isIn(X,T).

Как ни странно, он возвращает true только для blue, smooth и combo5. Что-то не так с моей рекурсией? (Я так не думаю, так как он мог читать blue, smooth и вплоть до combo5)

Вывод, который я получаю

?- exists(combo1).
false

?- exists(X).
X = blue;
X = smooth;
X = combo5;
false

Оцените любую помощь по этому поводу. Большое спасибо!

EDIT: исправленная попытка

exists(X) :- store(_,_,S), isIn(X,S).

isIn(X, [smoothie(X,_,_)]).
isIn(X, [smoothie(N,_,_)|T]) :- isIn(X,T).

EDIT: фиксированная

exists(X) :- store(_,_,S), isIn(X,S).

isIn(X, [smoothie(X,_,_)|_]).
isIn(X, [smoothie(N,_,_)|T]) :- isIn(X,T).

1 Ответ

1 голос
/ 05 мая 2020

[smoothie(X,_,_) | []] совпадает с [smoothie(X,_,_)].

isIn( X, S ) эквивалентно

isIn( X, S ) :-
  last(  S, smoothie(X,_,_) ).

, которое объясняет ваши наблюдения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...