Вопросы по теме 'unification'

разрешение унификации пролога
Почему это работает: power(_,0,1) :- !. power(X,Y,Z) :- Y1 is Y - 1, power(X,Y1,Z1), Z is X * Z1. И это дает исключение переполнения стека? power(_,0,1) :- !. power(X,Y,Z) :- power(X,Y - 1,Z1), Z is X * Z1.
1361 просмотров

Сопоставление с образцом эквивалентных переменных в Haskell, например, в Prolog
В прологе мы можем сделать что-то вроде следующего: myFunction a (a:xs) = ... То есть, когда 1-й аргумент myFunction совпадает с первым элементом списка во 2-м аргументе, эта функция будет оцениваться как ... . Теперь мой вопрос: как...
1401 просмотров

Создать экземпляр переменной типа в Haskell
EDIT: Решено. Я не знал, что включение расширения языка в исходном файле не включает расширение языка в GHCi. Решение было :set FlexibleContexts в GHCi. Недавно я обнаружил, что объявления типов в классах и экземплярах Haskell являются...
1007 просмотров

Учитывая замену S и список Xs, как применить S к Xs
Предположим, у меня есть замена S и список Xs , где каждая переменная, встречающаяся в Xs , также встречается в S . Как мне найти список S(Xs) , т. е. список, полученный применением замены S к списку Xs . Более конкретно, у меня есть...
135 просмотров
schedule 25.07.2022

Объединение и замена
В Haskell я определил полиморфный тип данных Subst a с одним конструктором S :: [(String, a)] -> Subst a следующим образом: data Subst a where S :: [(String, a)] -> Subst a deriving (Show) Я хочу определить функцию...
500 просмотров
schedule 22.06.2022

Ошибка типа в функции Haskell
Я написал функцию Haskell следующим образом: shift :: Subst a -> Subst a shift (S s) = [(x, (subst s' d)) | (x,d) <- s] where s' = [(x,d) | (x,d) <- s, null (vars d)] С таким типом данных data Subst a = S [(String,a)] Я...
110 просмотров
schedule 16.07.2023

Почему двойное отрицание не связывается в Прологе
Скажем, у меня есть следующая теория: a(X) :- \+ b(X). b(X) :- \+ c(X). c(a). Он просто говорит истина, что, конечно, правильно, a(X) истинно, потому что нет b(X) (с отрицанием как конечный отказ). Поскольку есть только b(X) , если...
1180 просмотров
schedule 24.06.2023

Объединение расширенных терминов, двойное отрицание
Мне нужно ввести предикат, который позволит мне отрицать атомы. Пока у меня neg(Premise) :- \+ Premise. , что дает мне следующие результаты: ?- assert(a). true. ?- a. true. ?- neg(a). false. ?- neg(neg(a)). true. В этом есть смысл, и все...
108 просмотров
schedule 15.05.2022

Унификация списка пролога
Я пытаюсь углубить свое понимание Пролога и того, как он обрабатывает объединение списков. Так что я застрял на этом примере, потому что знаю ответ, выполняя код, но не могу понять, как он работает. [X,a,X,f(X,a)|Y] = [Z,Z|Y] Ответ: X=Z...
336 просмотров
schedule 08.02.2023

Унификация и неявное приведение параметра типа
class Base и class Ext extends Base . class B<T> с типизированным методом foo<T>(value:T) Почему B<Base>.foo не принимает экземпляр B<Ext> (неявное понижение параметра типа?) по умолчанию? Вот пример:...
92 просмотров
schedule 13.03.2023

is_list/1 и свободные переменные
Вот первое наблюдение: ?- is_list([]), is_list([_,_,_]). true. Вот еще одно наблюдение: ?- [] = _, [_,_,_] = _. true. Следовательно, зачем is_list/1 реализовывать так, чтобы ?- is_list(_). false. or ?- is_list([_|_])....
421 просмотров
schedule 04.09.2022

Правильная работа с множествами в Прологе
В Прологе кажется, что множества представлены списками. Например, вот реализация union/3 из SWI-Prolog: union([], L, L) :- !. union([H|T], L, R) :- memberchk(H, L), !, union(T, L, R). union([H|T], L, [H|R]) :- union(T, L, R)....
1136 просмотров
schedule 21.03.2023

Какие алгоритмы использует компилятор Rust для определения переменных времени жизни?
fn foo<'a>(x: &'a i32, y: &'a i32) {} fn main() { let a = 123; { let b = 234; foo(&a, &b); } } Надеемся, что в приведенном выше коде &a и &b должны быть ссылки с разным временем...
880 просмотров
schedule 28.12.2022

Схемы рекурсии Haskell: одновременный обход двух структур
Я пытаюсь написать алгоритм объединения Робинсона, используя схемы рекурсии. Алгоритм объединения принимает два типа и выдает результат. Тип - это: data TypeF a = TypeApplication a a | TypeVariable Name deriving...
175 просмотров

Реализация унификации и пропуска переменных
Я работаю над реализацией обычного алгоритма унификации обычным способом: рекурсивный спуск по деревьям выражений, попутно добавляя привязки переменных к хеш-таблице, выполняя проверку возникновения. В Java, как это бывает, используются функции...
261 просмотров
schedule 28.03.2022

Унификация структуры функций в миниканрене
Как определить унификация и включение в состав структуры признаков в миниканрене, если мы представляем структуры признаков со списками ? Общее поведение будет примерно таким (я думаю): (run* (q) (unifyo '(a b) '(a b) q))) => (a b)...
225 просмотров
schedule 01.07.2022

Алгоритм Куайна с односторонним объединением в Прологе
В новом выпуске SWI-Prolog 8.3.19 вводится односторонняя унификация внутри новых правил стиля Picat. Это могло быть долгожданным дополнением к любой системе Prolog. Мне было интересно, сможем ли мы переписать алгоритм Куайна Реализация пролога...
76 просмотров