λProlog отклоняет гипотетические логические запросы?
Я подозреваю, что teyjus, основная реализация λProlog, может быть немного заброшенным, но λProlog — это увлекательный Пролог, который должен позволить вам использовать логику более высокого порядка, гипотетические рассуждения и другие вещи, поэтому я пытаюсь используй это.
Файл "example.sig":
sig example.
kind person, language type.
type hans person.
type german, french, italian language.
type grade person -> o.
type take person -> language -> o.
Файл "пример.мод":
module example.
(grade P) :- (take P german), (take P french).
(grade P) :- (take P german), (take P italian).
take hans french.
Однако, когда я компилирую и загружаю его, хотя кажется, что он работает, запросы на гипотетические рассуждения отклоняются:
[example] ?- take X Y.
The answer substitution:
Y = french
X = hans
More solutions (y/n)? y
no (more) solutions
[example] ?- grade X.
no (more) solutions
[example] ?- (take hans german) => (grade hans).
(1,19) : Error : Symbol => is not permitted within terms
Я ожидал "да" в конце. Что я делаю не так?
2 ответа
Текущая версия Teyjus не позволяет вводить импликации в запросах непосредственно на верхний уровень. В книге Гопалана Надатура и меня (Programming with Higher-Order Logic) эта проблема и обходной путь упоминаются в Приложении (см. отрывок ниже).
A.4.2 Отклонения от языка, принятого в этой книге (стр. 287)
[...]
Тейюс не разрешает использовать импликации в целях высшего уровня. Эта характеристика может измениться в будущем, когда модель компиляции будет расширена и для этих целей, но на данный момент это означает, что некоторые примеры, представленные, например, в Разделе 3.2, не могут быть запущены непосредственно с помощью этой системы. Обратите внимание, что импликации запрещены только в целях верхнего уровня: их можно свободно использовать в целях, которые появляются в основной части пунктов программы. Таким образом, это ограничение можно преодолеть, сначала создав подходящее предложение программы, а затем используя его для постановки желаемого запроса. Например, вместо постановки запроса
?- p a => p b => p X.
можно создать пункт
test X :- p a => p b => p X.
а затем используйте запрос
?- test X.
Расширьте «example.sig»:
type whatif language -> o.
Расширьте «example.mod»:
(whatif Q) :- ((take hans Q) => (grade hans)).
И тогда это работает:
Похоже, что λProlog отложен, я поднял вопрос №122 .
Или есть какая-то фундаментальная проблема, с которой он не работает,
например, проблемы с типизацией или оптимизация компилятора?
PS: я жил опасно и скачал tjsim.exe и т. д. отсюда:
http://www.eecs.ucf.edu/~leavens/Windows/usr-local-bin/