#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, и теперь он работает, когда я его удалил.