Проблемы с библиотекой (лямбда), каррированием и SWI Prolog

Так что я столкнулся с некоторыми проблемами при (ab?) Использовании lambda.pl.

Я делаю «use_module (библиотека (лямбда))». в первых строках файла, к которому я обращаюсь через ["a.prolog"]. Затем я получаю "неопределенную процедуру () / 3" и после этого немного тарабарщины.

То же самое происходит для любого порядка use_modules. Это происходит независимо от того, загружаю ли я a.prolog через [...], консультируюсь или как скрипт из командной строки. Я сократил сценарий до примера каррирования из кода Россеты https://rosettacode.org/wiki/Currying#Prolog

use_module(library(lambda)).

:- initialization(main, main).

main :-
    N = 5, F = \X^Y^(Y is X+N), maplist(F, [1,2,3], L),
    print(L).

Не работает.

Однако он работает, если я вручную загружаю «лямбда» в командной строке swipl и сразу же обращаюсь к a.prolog. Тогда цель N = 5, .... работает нормально.

Однако если я сначала проконсультируюсь с a.prolog; затем вручную use_module, а затем запустите запрос, я получаю сообщение об ошибке. Реконсультации не помогают дальше.

Так или иначе, первая команда в приглашении должна быть use_module.

Или у меня совершенно неправильный механизм загрузки? Если да, пожалуйста, извинитесь; но я хотел бы получить подсказку, как решить эту проблему.


person KayHamacher    schedule 26.03.2018    source источник
comment
Незначительный комментарий: лучше использовать F_2 вместо F. Таким образом вы поясняете, что F_2 - это неполная цель, требующая еще двух аргументов.   -  person false    schedule 28.03.2018


Ответы (1)


Это распространенная ошибка при первом использовании модулей.

Взгляните на эту строку:

use_module(library(lambda)).

Это просто факт, когда говорится, что "use_module(library(lambbda)) держится".

Вместо этого вам нужна директива.

Директива - это термин с первичным функтором (:-)/1. То есть вы хотите:

:- use_module(library(lambda)).

ИЗМЕНИТЬ: для конкретного случая library(lambda) я хотел бы добавить, что есть страница с большим количеством полезной информации о нем, которую немного сложно найти:

http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord

"Hiord" означает более высокий порядок.

person mat    schedule 26.03.2018
comment
Ой ... это неловко. Огромное спасибо. На самом деле это была моя ошибка. - person KayHamacher; 27.03.2018
comment
Если это вас утешит: это довольно распространенная проблема, я видел это также у нескольких студентов, иногда потому, что даже на слайдах их инструкторов есть эта ошибка! - person mat; 27.03.2018
comment
Вы меня в принципе избавили от показа таких слайдов ;-) - person KayHamacher; 28.03.2018
comment
Отлично! Я думаю, это здорово, что вы знакомите студентов с library(lambda). Обратите внимание на домашнюю страницу: на ней также есть пример для арифметики это, на мой взгляд, даже лучше, потому что оно более общее и использует декларативную целочисленную арифметику! Надеюсь, вы сочтете это полезным. - person mat; 28.03.2018
comment
На самом деле должна быть ошибка разрешения, как это делает SICStus Prolog. - person false; 28.03.2018