SWI-Пролог, анализирующий входные данные без запроса

#prolog

#пролог

Вопрос:

Здесь у меня есть простой код:

 main:-
    read_string(user_input,"n","rt",_,S),
    split_string(S," ", "", Ls),
    ask(Ls).

ask([First, Second|O]) :-
    First = who,
    Second = sells,
    write(O).
  

Проблема в том, что при вводе этого:

 ?- main.
|:who sells fries
false.

?- ask([who, sells, fries]).
[fries]
true.
  

Я хочу, чтобы 1-й вариант работал как второй, и я не могу понять, почему он не работает. Разве запрос «кто продает картофель фри», запрашиваемый через main, не должен совпадать с запросом «спросить» самого себя?

Я упускаю какую-то фундаментальную проблему с функциональным программированием (с которой, я признаю, я действительно борюсь)?

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

1. Это не функциональное программирование 😉 это логическое программирование! Но вы должны просто попробовать и отладить материал, надеюсь, вы увидите свою ошибку.

Ответ №1:

Prolog способен обрабатывать строки по одному символу за раз. Но люди предпочитают читать строки как слова. Таким образом, в Prolog есть разные способы выражения строк, в зависимости от флага double_quotes .

Я предлагаю вам ознакомиться с основными типами данных в Prolog.

Первый запрос main/0 завершается с ошибкой, потому что прочитанная строка: кто продает картофель фри и разделенная на список вложенных строк: кто продает картофель фри, не будет объединена со списком атомов, кто продает картофель фри в предикате ask /1. Чтобы выполнить этот запрос успешно, перепишите:

 ask([First, Second|O]) :-
    First = "who",    % check for the string "who"
    Second = "sells", % check for the string "sells"
    write(O).
  

Второй запрос предоставляет ask/1 список атомов, которые будут объединены с атомами в ask / 1.

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

1. Спасибо, я действительно пробовал ваше предложение ранее, но забыл, что установил флаг двойных кавычек на char, и теперь он работает, когда я его удалил.