使用 Prolog 计算多项式的 GCD

2023-12-14

标题已经说明了一切。我正在计算两个多项式的 GCD。有什么办法可以在 Prolog 中完成这个任务吗?如果是这样,什么是好的起点?具体来说,我在如何使用 Prolog 实现多项式除法方面遇到了麻烦。

编辑以包括示例输入和输出:

输入示例:

?-  GCD(x^2 + 7x + 6, x2 − 5x − 6, X).

输出示例:

X = x + 1.

Solution

如果其他人需要这样做,这是我的最终解决方案:

tail([_|Tail], Tail).
head([Head | _], Head).

norm(Old, N, New) :- 
    length(Tail, N),
    append(New, Tail, Old).
norm(Old, N, []) :-
    length(Old, L),
    N > L.

mult_GCD(List, GCD) :- length(List, L),
    L > 2, tail(List, Tail),
    mult_GCD(Tail, GCD).
mult_GCD([H | T], GCD) :-
    length(T, L),
    L == 1, head(T, N),
    gcd(H, N, GCD).

lead(List, List) :-
    length(List, L),
    L == 1.
lead([0 | Tail], Out) :- 
    !, lead(Tail, Out).
lead([Head | Tail], [Head | Tail]) :- Head =\= 0.

poly_deg([], 0).
poly_deg(F, D) :-
    lead(F, O),
    length(O, N),
    D is N - 1.

poly_red([0], [0]).
poly_red(Poly, Out) :-
    mult_GCD(Poly, GCD),
    scal_div(Poly, GCD, Out).

poly_sub(Poly,[],Poly) :- Poly = [_|_].
poly_sub([],Poly,Poly).
poly_sub([P1_head|P1_rest], [P2_head|P2_rest], [PSub_head|PSub_rest]) :-
    PSub_head is P1_head-P2_head,
    poly_sub(P1_rest, P2_rest, PSub_rest).

scal_prod([],_Sc,[]).
scal_prod([Poly_head|Poly_rest], Sc, [Prod_head|Prod_rest]) :-
    Prod_head is Poly_head*Sc,
    scal_prod(Poly_rest, Sc, Prod_rest).

scal_div([],_,[]).
scal_div([Poly_head|Poly_rest], Sc, [Prod_head|Prod_rest]) :-
    Prod_head is Poly_head / Sc,
    scal_div(Poly_rest, Sc, Prod_rest).

poly_div(Num, Den, OutBuild, Out) :-
    poly_deg(Num, X),
    poly_deg(Den, Y),
    X < Y,
    Out = OutBuild.
poly_div(INum, IDen, OutBuild, Out) :-
    lead(INum, [NumHead | NumTail]), lead(IDen, [DenHead | DenTail]),
    Q is NumHead / DenHead,
    append(OutBuild, [Q], Out1),
    append([DenHead], DenTail, DenNorm), append([NumHead], NumTail, Num),
    scal_prod(DenNorm, Q, DenXQ),
    poly_sub(Num, DenXQ, N),
    poly_div(N, IDen, Out1, Out).

poly_mod(Num, Den, Out) :-
    poly_deg(Num, X), poly_deg(Den, Y),
    X < Y,
    lead(Num, Out1),
    poly_red(Out1, Out2),
    lead(Out2, Out).
poly_mod(INum, IDen, Out) :-
    lead(INum, [NumHead | NumTail]), lead(IDen, [DenHead | DenTail]),
    Q is NumHead / DenHead,
    append([DenHead], DenTail, DenNorm), append([NumHead], NumTail, Num),
    scal_prod(DenNorm, Q, DenXQ),
    poly_sub(Num, DenXQ, N),
    poly_mod(N, IDen, Out).

poly_gcd(X, Y, X):- poly_deg(Y, O), O == 0, !.
poly_gcd(Y, X, X):- poly_deg(Y, O), O == 0, !.
poly_gcd(X, Y, D):- poly_deg(X, Xd), poly_deg(Y, Yd), Xd > Yd, !, poly_mod(X, Y, Z), poly_gcd(Y, Z, D).
poly_gcd(X, Y, D):- poly_mod(Y, X, Z), poly_gcd(X, Z, D).

gcd(X, Y, Z) :-
    X < 0, X > Y, !,
    X1 is X - Y,
    gcd(-X, Y, Z).
gcd(X, Y, Z) :-
    Y < 0, Y >= X, !,
    Y1 is Y - X,
    gcd(X, -Y, Z).
gcd(X, 0, X).
gcd(0, Y, Y).
gcd(X, Y, Z) :-
    X > Y, Y > 0,
    X1 is X - Y,
    gcd(Y, X1, Z).
gcd(X, Y, Z) :-
    X =< Y, X > 0,
    Y1 is Y - X,
    gcd(X, Y1, Z).
gcd(X, Y, Z) :-
    X > Y, Y < 0,
    X1 is X + Y,
    gcd(Y, X1, Z).
gcd(X, Y, Z) :-
    X =< Y, X < 0,
    Y1 is Y + X,
    gcd(X, Y1, Z).

这个答案意味着朝着正确的方向推动。

首先,暂时忘记您需要解析如下表达式x^2 + 7x + 6;这在 Prolog 中还不是一个合适的术语。如果你尝试把它写在顶层,你会得到一个错误:

?- Expr = x^2 + 7x + 6.
ERROR: Syntax error: Operator expected
ERROR: Expr = x^2 + 
ERROR: ** here **
ERROR: 7x + 6 . 

Prolog不知道如何处理7x你在那里。解析表达式本身就是一个问题,如果您假设已经解析了它并获得了如下所示的表示,也许会更容易:

[6, 7, 1]

相似地,x^2 − 5x − 6变成:

[-6, -5, 1]

要表示 0,您可以使用空列表:

[]

现在,看一下维基百科页面上的算法。它用deg对于学位和lc为首项系数。通过上面的列表表示,您可以将它们定义为:

次数比保存系数的列表的长度减一。

poly_deg(F, D) :-
    length(F, N),
    D is N - 1.

首项系数是列表的最后一个元素。

poly_lc(F, C) :-
    last(F, C).

您还需要能够使用多项式进行简单的算术运算。使用上的定义维基百科页面,我们看到例如添加[] and [1]应该给你[1], 相乘[-2, 2] with [1, -3, 1]应该给你[-2, 8, -8, 2]. A 前兆搜索给我这个问题在 Stackoverflow 上。使用那里定义的谓词:

?- poly_prod([-2,2], [1, -3, 1], P).
P = [-2.0, 8.0, -8.0, 2] .

?- poly_sum([], [1], S).
S = [1].

从现在开始,您应该可以尝试实现多项式除法,如我上面链接的 Wiki 文章中所述。如果您遇到更多麻烦,您应该编辑您的问题或提出新问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Prolog 计算多项式的 GCD 的相关文章

  • 函数式语言中的多线程? (序言)

    当我的朋友在学校开始学习 Prolog 时 我嘲笑他学习了一门无用的语言 然而 他向我展示了一些我从来不知道可能发生的东西 我想知道这个技术从何而来 技术是这样的 permutation List isAMember X List dele
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • 在序言中减去或添加列表的列表?

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • Prolog 匹配 vs miniKanren 统一

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • Prolog中如何选择bagof、setof和findall

    如何在 bagof setof 和 findall 之间做出选择 有什么重要的区别吗 哪个最常用 哪个最安全 感谢您的评论 回答 我检查了SWI Prolog 手册页findall 3 http www swi prolog org pld
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • 一次性删除不正确的后续解决方案

    我有一个谓词 它找到正确的解决方案 但随后又找到不正确的解决方案 data D data threshold nonredundantbumps D 5 Bs write D 3 6 7 8 2 4 5 6 9 4 7 3 D 3 6 7
  • Prolog DCG:找到最后一个元素

    我正在尝试更好地理解 DCG 的用途 为了做到这一点 我尝试将 LearnPrologNow 书中的一些练习转换为 DCG 表示法 然而 我却失败得很惨 我试图编写一个程序 仅命名列表中的最后一个元素 就这样 我只是想不出正确的 DCG 语
  • 高阶“解决方案”谓词

    我正在使用一个更高阶的 Prolog 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103

随机推荐

  • iPhone - CLHeading 寻找方向

    在我的 iPhone 应用程序中 我使用 CLLocationManager 来查找我的 iPhone 指向的方向 我正在使用 标题 属性 它给了我 x y 和 z 值 如何从这些值中找到我当前指向的方向 北或南或东或西 你应该使用方法 l
  • 自定义查询分页 Cakephp

    我的控制器中有一个自定义查询 我想实现在 cakephp org 上找到的自定义查询分页 但他们的示例与我的示例不相似 有人可以帮我根据我的观点对这个结果进行分页吗 cars this gt Car gt query select Car
  • Java:类.this

    我有一个看起来像这样的 Java 程序 public class LocalScreen public void onMake aFuncCall LocalScreen this oneString twoString 什么是LocalS
  • PHP 会话启动“无法发送会话 cookie 和缓存限制器”

    我已将我的托管服务器从 Windows 系统更改为 Linux 系统 但是当我运行 PHP 程序时 出现以下错误 Warning session start function session start Cannot send sessio
  • 添加 firebase-ui-auth:2.3.0 依赖项时出错

    我从昨天开始就面临这个问题 我添加 Add Library compile com android support design 26 1 0 compile com firebaseui firebase ui 0 2 0 compile
  • 使用异步任务在 gridview 中加载图像,未正确加载

    我正在尝试在 gridview 异步中加载缩略图 因为其他方式显示时间太长 当我以正常方式进行操作时 它可以很好地显示图像 代码和图像 Utils public static Bitmap getThumbnail Context cont
  • ValueError:未知的 MS 编译器版本 1900

    我正在尝试使用 cygwin mingw 在 Windows 10 上使用 Python 3 5 运行一些代码 准确地说 我使用的是 PyDSTool 模块 我将其称为 dopri 积分器 问题是 我遇到了麻烦distutils无法识别 M
  • 在 WooCommerce 中列出带有订单详细信息的优惠券

    我有一个有 1000 张优惠券的网站 所有优惠券的使用限额均为一张 我使用 Raunuk Gupta 提供的代码直接从 SQL 数据库导出优惠券 WooCommerce 优惠券如何存储在数据库中 是否可以检索使用优惠券的用户的订单元 我想在
  • 查询 Parquet 记录中的嵌套数组

    我正在尝试不同的方法来查询记录数组中的记录并将完整的行显示为输出 我不知道哪个嵌套对象有字符串 pg 但我想查询特定对象 对象是否有 pg 如果 pg 存在 那么我想显示完整的行 如何在嵌套对象上编写 spark sql查询 而不指定对象索
  • Swift 中的不可变/可变集合

    我指的是 Apple 的 Swift 编程指南 以了解用 Swift 语言创建可变 不可变对象 数组 字典 集合 数据 但我无法理解如何在 Swift 中创建不可变集合 我希望看到 Swift 中 Objective C 中的等价物 不可变
  • Boost::signals2 - 使用槽解析对象

    考虑一下 include
  • 具有自定义 VPN 连接的 iOS 应用程序

    我想创建可以使用 PPTP L2TP 或 OpenVPN 连接到 VPN 的应用程序 但我找不到任何有关此的信息 仅在ios 8 SDK中找到有关使用IPSec和IKEv2的信息 如果您想在 ios 8 中以编程方式连接 则只能使用 IPS
  • iPhone Mapkit 将自定义图像和图钉添加到注释中

    我正在尝试将图钉颜色从默认红色更改为自定义图像 但我所做的任何尝试都不起作用 我从这个网站下载了示例代码 http icodeblog com 2009 12 21 introduction to mapkit in iphone os 3
  • 将 UIActivityIndi​​cator 添加到模态视图(ELCimagepicker)

    我已将 ELCimagepicker https github com Fingertips ELCImagePickerController 添加到我的项目中 它运行良好 允许用户为幻灯片选择多个图像 但是 当您单击 保存 时 可能会出现
  • ASP.net AJAX 拖/放?

    我想知道是否有人知道是否有一个预先制定的解决方案 我在 ASP net 网站上有一个列表 我希望用户能够通过拖放对列表进行重新排序 此外 我希望有第二个列表 用户可以将第一个列表中的项目拖到其中 到目前为止 我找到了两个解决方案 重新排序列
  • 构建三元网格,在 Matlab 中评估网格上的函数和等高线图

    我需要评估一个函数 比如说 Fxy 2 x 2 3 y 2 在三元网格 x 范围 0 1 y 范围 0 1 和 1 x y 0 1 上 我无法构建需要评估上述函数的三元网格 另外 一旦评估 我需要在三元等高线图中绘制函数 理想情况下 我需要
  • HTML 敏捷包 - 删除不需要的标签而不删除内容?

    我在这里看到了一些相关的问题 但它们并没有完全讨论我面临的同一问题 我想使用HTML 敏捷包从我的 HTML 中删除不需要的标签 而不会丢失标签内的内容 例如 在我的场景中 我想保留标签 b i and u 对于这样的输入 p my par
  • 如何为 Google App Engine 应用程序编写“app.yaml”文件?

    我注册了一个 Google App Engine 应用程序 并且有以下一些文件 index html tabs css tab js temp py 我应该怎样写app yaml file 您应该将静态文件放入某个目录中 例如staticd
  • 在 NumPy 数组中使用 array.dtype = 分配 dtype 值会产生不明确的结果

    我是编程和 numpy 的新手 在阅读教程并在 jupyter notebook 上进行实验时 我想到按如下方式转换 numpy 数组的 dtype import numpy as np c np random rand 4 10 prin
  • 使用 Prolog 计算多项式的 GCD

    标题已经说明了一切 我正在计算两个多项式的 GCD 有什么办法可以在 Prolog 中完成这个任务吗 如果是这样 什么是好的起点 具体来说 我在如何使用 Prolog 实现多项式除法方面遇到了麻烦 编辑以包括示例输入和输出 输入示例 GCD