精华内容
下载资源
问答
  • 最一般合一算法

    2012-07-02 22:49:56
    C++ 实现最一般合一算法,此代码还有些不完善,如有兴趣可共同探讨探讨
  • 合一算法求最一般合一Do you wishyou could browse a massive collection of retro gamesfrom your couch, without having to connect a bunch of systems or cobble togethervarious emulators? RetroArch makes it...
    合一算法求最一般合一

    合一算法求最一般合一

    retro-arch-fun

    Do you wish you could browse a massive collection of retro games from your couch, without having to connect a bunch of systems or cobble together various emulators? RetroArch makes it possible. This all-in-one emulation station can run almost any retro game imaginable, and works on Windows, Mac, and Linux computers.

    您是否希望可以从沙发上浏览大量的复古游戏,而不必连接一堆系统或将各种仿真器拼凑在一起? RetroArch使之成为可能。 这个多合一的仿真站几乎可以运行任何可以想象到的复古游戏,并且可以在Windows,Mac和Linux计算机上运行。

    RetroArch is awesome, but it’s a little tricky to set up. Don’t panic, though, because it’s far from impossible. Here’s how to set up RetroArch on your home theater PC, or any other computer, so you can emulate all your favorite retro games in one fell swoop.

    RetroArch很棒,但是设置起来有些棘手。 但是,不要惊慌,因为这绝非不可能。 这是在家庭影院PC或任何其他计算机上设置RetroArch的方法,因此您可以一口气模拟所有喜欢的复古游戏。

    We’ve shown you how to play your favorite retro games on your Windows computer, and those tools still work. RetroArch makes things easier by putting all your games in the same place, and giving you a couch-ready interface for browsing your collection. Whether you’re a Nintendo, PlayStation, Sega, or even DOS fanatic, you can add your favorites to one unified menu.

    我们已经向您展示了如何在Windows计算机上玩自己喜欢的怀旧游戏 ,并且这些工具仍然有效。 RetroArch通过将所有游戏放在同一位置,并为您提供了一个易于使用的界面来浏览您的收藏集,从而使事情变得更容易。 无论您是Nintendo,PlayStation,Sega还是DOS狂热者,都可以将收藏夹添加到一个统一菜单中。

    第一步:下载RetroArch (Step One: Download RetroArch)

    Head to the Libretro home page, then click the “Downloads” link in the top-right menu. Here you’ll find the latest release for your platform. For example, if you’re a Windows user, click the “Windows” folder.

    转到Libretro主页 ,然后单击右上方菜单中的“下载”链接。 在这里,您将找到适用于您平台的最新版本。 例如,如果您是Windows用户,则单击“ Windows”文件夹。

    download-retro-arch

    Browse and you’ll find a 7-Zip archive containing Retroarch. You’ll need to download and install 7-Zip if you haven’t already, in order to open the archive. Drag the contents of this archive to a folder, and put that folder anywhere you’d like. I put mine in “D:\Retroarch”, but it’s up to you.

    浏览,您将找到一个包含Retroarch的7压缩存档。 如果您尚未下载并安装7-Zip,则需要打开该档案。 将此存档的内容拖到一个文件夹,然后将该文件夹放在您想要的任何位置。 我将我放在“ D:\ Retroarch”中,但这取决于您。

    retroarch-files

    To launch RetroArch, simply double-click “retroarch.exe”.

    要启动RetroArch,只需双击“ retroarch.exe”。

    第二步:配置控制器 (Step Two: Configure Your Controllers)

    The RetroArch user interface can be overwhelming at first, throwing you directly into a menu of configuration options. Don’t worry: it’s simpler than it looks.

    首先,RetroArch用户界面可能不堪重负,直接将您带入配置选项菜单。 不用担心:它比看起来简单。

    retroarch-main

    The first thing you need to know is your mouse is not useful here. Click wherever you want, nothing is going to happen. Instead, browse the menu using your arrow keys. Up and down scrolls through the list; right and left jumps from one menu to another, indicated by the icons at the top of the screen. “Enter” lets you select a menu item, “Backspace” lets you jump back a level.

    您需要了解的第一件事是鼠标在这里没有用。 单击所需的任何地方,将不会发生任何事情。 而是使用箭头键浏览菜单。 上下滚动列表; 左右从一个菜单跳到另一个菜单,由屏幕顶部的图标指示。 “ Enter”使您可以选择菜单项,“ Backspace”使您可以跳回一个级别。

    Of course, if you want to browse your collection from the couch with a gamepad, the first thing you’re going to want to do is set up your controller to work with RetroArch. In our tests, an Xbox 360 controller worked out-of-the-box, but if your controller isn’t working to browse the menu–or you want to configure the buttons differently–we can change that.

    当然,如果要使用游戏板在沙发上浏览收藏夹,则要做的第一件事就是设置控制器以与RetroArch一起使用。 在我们的测试中,Xbox 360控制器是开箱即用的,但是如果您的控制器无法浏览菜单(或者您想以其他方式配置按钮),我们可以进行更改。

    With your keyboard, head to the Settings menu, which is represented at the top of the screen by two gears. Scroll down to “Input”, then hit Enter.

    使用键盘进入设置菜单,该菜单在屏幕顶部以两个齿轮表示。 向下滚动到“输入”,然后按Enter。

    retroarch-input

    Now scroll down to “Input User 1 Binds”, and scroll down to “User 1 Bind All”. Click that and you can map buttons to your gamepad.

    现在向下滚动到“输入用户1绑定”,然后向下滚动到“用户1绑定所有”。 单击该按钮,即可将按钮映射到游戏手柄。

    retroarch-buttons

    The RetroArch bindings work across all emulators, and are designed to consistently mimic the gamepads that came with the appropriate systems. You should, ideally, configure your joystick so that the buttons line up with those in this image:

    RetroArch绑定可在所有仿真器上使用,并且旨在始终如一地模拟相应系统随附的游戏手柄。 理想情况下,您应该配置游戏杆,以使按钮与该图中的按钮对齐:

    retropad-retroarch-gamepad

    Do that, and most games should play exactly the way you remember, though you can configure things differently if you prefer. Once this is set up, you can navigate the RetroArch menus using only your gamepad, so put the keyboard away if you don’t want it.

    这样做,尽管您可以根据自己的喜好配置不同的游戏,但大多数游戏都应该按照您的记忆方式进行游戏。 设置完毕后,您就可以仅使用游戏板浏览RetroArch菜单,因此,如果不想使用键盘,请放开它。

    If you’re setting up a multiplayer rig, repeat this process for all of your controllers. It will all be worth it, I promise.

    如果您要设置多人游戏装备,请对所有控制器重复此过程。 我保证,这都是值得的。

    第三步:下载仿真器(又名“ Cores”) (Step Three: Download Emulators (aka “Cores”))

    Now that you’ve learned how to navigate RetroArch, it’s time to learn a few concepts. RetroArch isn’t itself an emulator; instead, it’s a front-end capable of running a wide number of emulators. These individual emulators are called cores within RetroArch, and you’re going to need to download the appropriate cores for the games you want to run.

    既然您已经了解了如何浏览RetroArch,现在该学习一些概念了。 RetroArch本身并不是模拟器。 相反,它是能够运行大量仿真器的前端。 这些单独的模拟器在RetroArch中称为核心 ,您将需要为要运行的游戏下载适当的核心。

    But don’t fire up your browser: you can install cores from inside RetroArch. Head back to the first column in RetroArch, then scroll down to “Online Updater”.

    但是不要启动浏览器:您可以从RetroArch内部安装核心。 回到RetroArch的第一列,然后向下滚动到“ Online Updater”。

    retro-arch-online-update

    Select “Core Updater”, the first item in the resulting menu. From here you can download a wide variety of cores. Scroll through the menu and download as many cores as you like. Cores are sorted by the systems they emulate, so download something to run all of your games.

    选择“ Core Updater”,即结果菜单中的第一项。 您可以从这里下载各种各样的内核。 滚动浏览菜单,然后下载所需数量的内核。 核心按它们所仿真的系统排序,因此请下载内容以运行您的所有游戏。

    retro-arch-cores

    If you’re not sure which core to choose for a particular system, don’t worry, you can experiment to find out which cores work best later. For the most part, however, they should be similar, so for now just choose one.

    如果您不确定为特定系统选择哪个内核,请不要担心,您可以尝试找出以后最适合的内核。 但是,在大多数情况下,它们应该是相似的,因此现在仅选择一个即可。

    第四步:添加您的ROM收藏 (Step Four: Add Your ROM Collection)

    Now that you’ve added some cores, it’s time to add your ROMs. We’ll assume you already have a collection of ROMs for the purposes of this guide.

    现在您已经添加了一些核心,是时候添加ROM了。 为了本指南的目的,我们假设您已经有了ROM的集合。

    RetroArch can scan a folder full of ROMs and organize them for you. From the main menu, head to “Add Content”. Pick “Scan Directory”, then browse your file system until you find your folder full of ROMs. Yellow text at the bottom of the screen will show you your progress. Once everything is done, head to the home screen and you’ll see a new icon: the controllers for each system you’ve added roms for. Use the right arrow key to access these menus and browse the games.

    RetroArch可以扫描一个装有ROM的文件夹并为您整理它们。 从主菜单转到“添加内容”。 选择“扫描目录”,然后浏览文件系统,直到找到充满ROM的文件夹。 屏幕底部的黄色文本将显示您的进度。 完成所有操作后,转到主屏幕,您将看到一个新图标:您为其添加了rom的每个系统的控制器。 使用右箭头键访问这些菜单并浏览游戏。

    retroarch-games

    From here you can browse your game collection. Try to open any of them, and you’ll be asked which core you want to run the game with. Pick one, and you’ll finally be brought to a screen from which you can run the game.

    从这里您可以浏览您的游戏收藏。 尝试打开其中的任何一个,系统都会询问您要使用哪个核心运行游戏。 选择一个,您最终将被带到一个可以运行游戏的屏幕。

    kirby-running-joy

    Congratulations! You’ve now got a pretty cool emulation setup that you can control from your couch. Get to playing!

    恭喜你! 现在,您已经有了一个非常酷的仿真设置,可以从沙发上进行控制。 开始玩吧!

    第五步:继续调整(如果要) (Step Five: Keep Tweaking, If You Want To)

    Eagle-eyed readers no doubt noticed the thumbnails shown in the above step. You can find these thumbnails in the “Online Updater” section where you downloaded cores, under “Thumbnails Updater”. Just select the systems you’ve added ROMs for and you’ve got thumbnails baked into the interface.

    雄心勃勃的读者无疑会注意到上面步骤中显示的缩略图。 您可以在下载内核的“在线更新器”部分的“缩略图更新器”下找到这些缩略图。 只需选择添加了ROM的系统,界面中就会显示缩略图。

    Actually, while you’re in the Online Updater, you might as well updated the core info files, the assets, and everything else. It’s just a matter of scrolling down the list and selecting everything.

    实际上,当您使用Online Updater时,还可以更新核心信息文件,资产和其他所有内容。 只需向下滚动列表并选择所有内容即可。

    Power users should also check out the “Settings” tab, where you’ll find the Video, Audio and a variety of other settings. You don’t have to go in and tweak this stuff, but power users will love diving in and making everything work just right. This forum thread, for example, has great settings for the ideal NES and SNES experience. Check out our guide to RetroArch’s advanced features if you really want to get the best experience.

    高级用户还应该签出“设置”标签,在该标签中,您可以找到视频,音频和其他各种设置。 您不必进行任何调整,但是高级用户将喜欢潜水并使一切正常工作。 例如, 此论坛主题为理想的NES和SNES体验进行了很好的设置。 如果您真的想获得最佳体验,请查看我们的RetroArch高级功能指南

    翻译自: https://www.howtogeek.com/260274/how-to-set-up-retroarch-the-ultimate-all-in-one-retro-games-emulator/

    合一算法求最一般合一

    展开全文
  • 人工智能中最一般合一的程序~~是自己写的,上课老师让写的
  • 最一般合一算法(c#版)

    2009-09-03 13:11:36
    人工智能课程里的最一般合一算法的C#语言实现
  • 最一般合一 大连理工大学 软件学院 曹晓东 人工智能
  • 最一般合一(删除策略) 大连理工大学 软件学院 曹晓东 人工智能
  • 公式集的合一

    千次阅读 2020-12-15 20:51:28
    定义3.3 设有公式集F={F1,F2,…,Fn},若存在一个代换λ使得 F1λ=F2λ=…=Fnλ ,则称λ为公式集F...定义3.4 设σ是公式集F的一个合一,如果对任一个合一θ都存在一个代换λ,使得θ=σ°λ 则称σ是一个最一般的合...

    定义3.3 设有公式集F={F1,F2,…,Fn},若存在一个代换λ使得 F1λ=F2λ=…=Fnλ    ,则称λ为公式集F的一个合一,且称F1,F2,…,Fn是可合一的。
    例如,设有公式集 F={P(x,y,f(y)),P(a,g(x),z)} 则下式是它的一个合一:
    λ={a/x,g(a)/y,f(g(a))/z}    a/x:a代换x的意思,并不是a除x
    一个公式集的合一一般不唯一。

    定义3.4 设σ是公式集F的一个合一,如果对任一个合一θ都存在一个代换λ,使得θ=σ°λ 则称σ是一个最一般的合一。 最一般合一是唯一的。

    求最一般合一

    差异集:两个公式中相同位置处不同符号的集合。
    例如:F1:P(x,y,z), F2:P(x,f(a),h(b)) 则D1={y,f(a)}, D2={z,h(b)}

    求取最一般合一的算法:
    1.令k=0,Fk=F, σk=ε。 ε是空代换。
    2.若Fk只含一个表达式,则算法停止,σk就是最一般合一。
    3.找出Fk的差异集Dk。
    4.若Dk中存在元素xk和tk,其中xk是变元,tk是项,且xk不在tk中出现,则置:
      σK+1=σk°{tk/xk}
      Fk+1=Fk{tk/xk}
      k=k+1
    然后转(2)。若不存在这样的xk和tk则算法停止。
    5.算法终止,F的最一般合一不存在。

    例如:
    设 F={P(a,x,f(g(y))),P(z,f(z),f(u))} 求其最一般合一。
    1.令F0=F, σ0=ε。 F0中有两个表达式,所以σ0不是最一般合一。
    2.差异集D0={a,z} 。
    3. σ1=σ0°{a/z}={a/z}     F1={P(a,x,f(g(y))),P(a,f(a),f(u))} 。
    4.D1={x,f(a)} 。
    5. σ2=σ1°{f(a)/x}={a/z,f(a)/x}     F2=F1{f(a)/x}={P(a,f(a),f(g(y))),P(a,f(a),f(u))} 。
    6.D2={g(y),u} 。
    7.σ3=σ2°{g(y)/u}={a/z,f(a)/x,g(y)/u}
    8.F3=F2{g(y)/u}={P(a,f(a),f(g(y))),P(a,f(a),f(g(y)))} 。因为F3中只有一个表达式,所以就是最一般合一,即     {a/z,f(a)/x,g(y)/u}

    展开全文
  • 合一算法的Python实现--人工智能

    千次阅读 2020-05-08 11:55:28
    定义2:表达式集合 {E1, … , Er} 的合一元σ称为是最一般合一元(most general unifier 简写为 mgu),当且仅当对集合的每一个合一θ都存在代换λ使得θ=σ·λ,即任何代换都可以由σ再次代换而来。 看一个例子,...
    • 考察 合一算法
    • 代码没写GUI,因为不喜欢这玩意,直接在终端中进行人机交互
    • 代码写的较为冗余,主要还是我没动力了,不想优化了,因为调试代码已经把我榨干了

    合一算法是什么?

    由来

    如何解决 谓词演算归结 的一个问题,即决定那两个子句是否为亲本子句。例如,下面两个文字
    是否能够成为亲本子句呢?

    L(f(x)) ∨ L(A)
    
    ~L(B)
    

    合一算法正是为此而来

    合一算法

    在谓词逻辑中,一个表达式的 常量符号、变量符号或函数式

    • 表达式的 例示(instance) 是指在表达式中用项来置换变量而得到特定的表达式,用来
      置换的项称为置换项。
    • 在归结过程中,寻找项之间合适的变量置换使表达式一致的过程,称为合一过程,简称合一(Unify)。

    定义1:若存在一个代换s,使得二个文字L1与L2进行代换后,有 L1s = L2s,即 L1与~L2为互补文字,则L1与L2为可合一的。这个代换s称为合一元(unifier)

    代换的使用:

    1. 只能用项(常量,变量或函数符号)t 去代换变量 x在公式中的一切出现,代换记为s = t/x,对一个公式F的作s代换记为Fs。显然,f(x)、A、B之间不存在代换。
    2. 任一被代换的变量不能出现在用作代换的表达式中。{g(x)/x}不是代换。
    3. 代换并非唯一。

    看一个例子,对于F= P(x, f(y), B),存在四种代换:

    s1 = {z/x, w/y},则Fs1 = P(z, f(w), B)   (较一般的代换)
    
    s2 = {A/y},则Fs2 = P(x, f(A), B)
    
    s3 = {g(z)/x, A/y},则Fs3 = P(g(z), f(A), B)
    
    s4 = {C/x, A/y},则Fs4 = P(C, f(A), B)   (限制最严的代换)
    
    s4称为基例示,因为作替换后不再含有变量。
    

    定义2:表达式集合 {E1, … , Er} 的合一元σ称为是最一般合一元(most general unifier 简写为 mgu),当且仅当对集合的每一个合一θ都存在代换λ使得θ=σ·λ,即任何代换都可以由σ再次代换而来。

    看一个例子,表达式集合{P(x), P(f(y))}是可合一的,其最一般合一元为{f(y)/x}。因为对此集合的合一元θ = {f(a)/x, a/y},有代换 λ = {a/y},使θ = σ·λ = {f(y)/x}·{a/y}

    再看一个例子,

    思路及代码

    代码实现之前的准备

    1. 为实现方便,可规定将每个文字和函数符表达成一个表,表中第一元素为谓词名,其余元素为变元。
      • P(x, y) 表示成 (P x y )f(x) 表示成 (f x )
      • 若变元为函数,则该变元为一个子表,子表中第一元素为函数名。如:P(f(x), y) 表示成 (P ( f x ) y ),这样谓词和函数都统一表示成表。
    2. 判断两个文字能否合一,则要判断它们所对应的表的各个项是否能够匹配,判断两个表项匹配的规则为:
      • 变量可与常量、函数或变量匹配;
      • 常量与常量,函数与函数,谓词与谓词相等才可以匹配。不同的常量,函数,谓词之间不能匹配;
    3. 判断两个文字能否合一,还必须判断表示文字的表的长度必须相等,并且谓词是否相同。
      例如:P( x , y ) 化成表形式为 (P x y ),其长度为3;
      Q( x , y , g(z) ) 化成表形式为 (Q x y (g z)),其长度为4。

    合一算法Unify(L1, L2)

    1. 若L1或L2为一原子,则执行
      • 若L1和L2恒等,则返回NIL
      • 若L1为一变量,则执行:
        • 若L1出现在L2中,则返回F;否则返回(L2/ L1
      • 若L2为一变量,则执行:
        • 若L2中出现在L1中,则返回F;否则返回(L1/ L2
      • 否则返回F
    2. 若length(L1)不等于length(L2),则返回F。
    3. 置SUBST(替代)为NIL,在结束本过程时,SUBST将包含用来合一L1和L2的所有代换。
    4. 对于i:=1 到L1的元素数|L1|,执行
      • 对合一L1的第 i 个元素和L2的第 i 个元素调用UNIFY,并将结果放在S中。
      • 若S = F,则返回F 。
      • 若S不等于NIL,则执行:把S应用到L1和L2的剩余部分;SUBST:=APPEND(S, SUBST)。返回SUBST。

    合一过程Unify(L1, L2)

    • 输入:
      L1, L2 为表示成为表的两个谓词
      例如:P(x, y) 输入为 (P x y )
      f(x) 输入为 (f x )
      P(f(x), y) 输入为 (P ( f x ) y )

    • 输出:
      如果找到代换,一张代换表作为其返回的值;
      如果返回空表NIL,表示可以匹配,但无需任何代换;
      如果返回由F值组成的表,则说明合一过程失败。

    代码

    import re
    
    """
    处理从键盘中读取的文字,返回列表
    - 中文字符切换为英文
    - 括号转化为列表
    - 空格转为逗号
    - 函数名一律转为大写字母
    """
    def handleWord(word):
        # 中文字符切换为英文; 空格转为逗号
        word = word.replace('(', '[').replace(')', ']').replace('(', '[').replace(')', ']').replace(' ', ',').strip()
        
        # 对谓词进行操作
        if len(word) > 3: 
            # 函数名一律转为大写字母
            def func(x):
                return '[' + x.string[x.start()+1].upper() 
            word = re.sub(r'\[(\w)', lambda x:func(x), word)
    
        # 将word中字母字符转化为ASCII码,为了使用eval直接将其转化为元组
        def func2(x):
            return str(ord(x.string[x.start()])) 
        word = re.sub(r'[a-zA-Z]', lambda x:func2(x), word)
    
        # 将其转化为列表,内部数据为int类型
        word = list(eval(str(word)))
        # print('---handleWord()---')
        # print(word)
        # print(type(word))
        # print('---handleWord()---')
        print()
    
        return word
    
    """
    判断是变量、常量还是函数
    - 是变量,返回1
    - 是常量,返回2
    - 是函数,返回3
    """
    def judge(x):
        if isinstance(x, list):
            return 3
        elif x >= 97 and x <= 122:
            return 1
        elif x >= 65 and x <= 90:
            return 2
    
    
    """
    合一算法
    """
    def unifyAtom(atom1, atom2):
        if judge(atom1) == 3 and judge(atom2) == 3:
            return unifyAllPre(atom1, atom2)
        if atom1 == atom2:
            return 'NIL'
        if judge(atom1) == 1:
            if str(atom1) in str(atom2):
                # print('--2--')
                return False
            else:
                return str(atom2) + '/' + str(atom1) + '/' + 'one' 
        elif judge(atom2) == 1:
            if str(atom2) in str(atom1):
                # print('--3--')
                return False
            else:
                return str(atom1) + '/' + str(atom2) + '/' + 'two'
        else:
            # print('--4--')
            return False
    
    # testNumber = 0
    results = []
    
    """
    合一算法(对谓词公式中的参数逐一判断)
    """
    def unify(L1, L2):
        global results
        for index in range(len(L1)):
            # global testNumber
            # testNumber += 1
            # print(testNumber)
            if(L1 == L2):
                return results
            atom1 = L1[index]
            atom2 = L2[index]
            S = unifyAtom(atom1, atom2)
            if not S or isinstance(S, list):
                # print('--5--')
                return S
            elif S != 'NIL':
                t = S.split('/')
                result = chr(int(t[0])) + '/' + chr(int(t[1]))
                if t[2] == 'one':
                    t1 = str(L1).replace(t[1], t[0])
                    L1 = list(eval(t1))
                if t[2] == 'two':
                    t2 = str(L2).replace(t[1], t[0])
                    L2 = list(eval(t2))
            results.append(result)
            # print(result)
            # print(L1,L2)
        return results
    
    """
    合一算法(两个文字都是谓词公式时)
    """
    def unifyAllPre(L1, L2):
        if len(L1) != len(L2) or L1[0] != L2[0]:
            # print('--1--')
            return False
        if L1 == L2:
            return 'NIL'
        del L1[0]
        del L2[0]
        return unify(L1, L2)
    
    
    def ui():
        print('----')
        print('--------合一算法--------')
        print('约定:')
        print('1.变量输入时为小写字母')
        print('2.常量输入时为大写字母')
        print('3.函数名输入时大写或小写字母,并且程序运行函数名不区分大小写,比如函数名f与函数名F等价')
        print('----')
        print('输入方式:')
        print('比如:P(x, y, g(z)) 输入形式为:(P x y (g z))')
        print('字符之间用一个空格分隔')
        print('----')
        print('输出结果:')
        print('有代换,即输出代换s')
        print('完全相等,输出NIL')
        print('合一失败,输出False')
        print('----')
        word1 = input("输入第一个文字:")
        word2 = input("输入第二个文字:")
        word1 = handleWord(word1)
        word2 = handleWord(word2)
        print(unifyAllPre(word1, word2))
    
    
    def main():
        ui()
    
    
    if __name__ == '__main__':
        main()
    
    
    
    • 代码注释处,之所以保留,是为了运行出问题时快速定位错误

    人机交互示例

    ----
    --------合一算法--------
    约定:
    1.变量输入时为小写字母
    2.常量输入时为大写字母
    3.函数名输入时大写或小写字母,并且程序运行函数名不区分大小写,比如函数名f与函数名F等价
    ----
    输入方式:
    比如:P(x, y, g(z)) 输入形式为:(P x y (g z))
    字符之间用一个空格分隔
    ----
    输出结果:
    有代换,即输出代换s
    完全相等,输出NIL
    合一失败,输出False
    ----
    输入第一个文字:(P x y W (q r (T y)))
    输入第二个文字:(P E D t (Q A (t D)))
    
    
    ['E/x', 'D/y', 'W/t', 'A/r']
    

    推荐文章

    命题逻辑归结推理 + 合一算法 = 谓词逻辑归结推理 就这样了吧

    展开全文
  • 人工智能复习题.docx

    2020-06-10 00:04:39
    叮叮小文库 叮叮小文库 PAGE PAGE # 1判断下列公式是否为可合一若可合一则求出其最一般合一 (1)P(a, b, P(x, y) (1) P(a, b, P(x, y) P(f(x, b, P(y, z(3) 解: P(f(x, b, P(y, z) (3) 解: (1) P(f(x, y, P(y, f(b) P...
  • 合一算法

    千次阅读 2016-11-22 08:43:00
    最一般合一(mgu)算法实现 */ #include <iostream> #include <string> #include <vector> using namespace std; struct transform //一组置换 { string t_f1; string t...
    /*
    
    最一般合一(mgu)算法实现
    
    */
    
    #include <iostream>
    
    #include <string>
    
    #include <vector>
    
    using namespace std;
    
    struct transform //一组置换
    
    {
    
    string t_f1;
    
    string t_f2;
    
    };
    
    //函数声明
    
    bool same(const string f1,const string f2) ;
    
    transform dif(const string f1,const string f2);
    
    string change(string f,transform q);
    
    string change2(string f,transform q);
    
    bool syncretism(const string f1,const string f2, vector<transform> & );
    
    int legal(transform &);
    
    bool var(const string s);
    
    string varData(string s);
    
    int main()
    
    {
    
    cout<<"const:capital\t"<<"varible:lowercase."<<endl;
    
    //输入两个谓词公式
    
    string f1,f2;
    
    cout<<"intput F1:";
    
    cin>>f1;
    
    cout<<"intput F2:";
    
    cin>>f2;
    
    vector <transform> mgu;
    
    if(syncretism(f1,f2,mgu))//存在最一般合一,并输出结果
    
    {
    
    cout<<"mgu={ ";
    
    int i=0;
    
    for(i=0;i<mgu.size()-1;i++)
    
    cout<<mgu[i].t_f1<<"/"<<mgu[i].t_f2<<", ";
    
    cout<<mgu[i].t_f1<<"/"<<mgu[i].t_f2<<" }"<<endl;
    
    }
    
    else //不存在最一般合一
    
    {
    
    cout<<"cannot be syncretized"<<endl;
    
    }
    
    return 0;
    
    }
    
    bool syncretism (const string tf1,const string tf2,vector<transform> &mgu)//合一方法,判断是否可进行合一
    
    {
    
    string	f1=tf1,	f2=tf2;
    
    while(!same(f1,f2))//f1与f2中的符号不完全相同时才进入while循环
    
    {
    
    transform t=dif(f1,f2);//得到f1和f2的一个差异集,并把它赋给t
    
    int flag=legal(t);
    
    if(flag==0)
    
    return false;
    
    else
    
    {
    
    mgu.push_back(t);
    
    f1=change(f1,mgu.back());
    
    f2=change(f2,mgu.back());
    
    cout<<"after change:"<<endl;
    
    cout<<"f1:"<<f1<<endl;
    
    cout<<"f2:"<<f2<<endl;
    
    if(same(f1,f2)) break;//f1和f2相同时就停止循环
    
    }
    
    }
    
    return true;
    
    }
    
    bool same(const string f1, const string f2) //判断两个谓词f1和f2是否相同
    
    {
    
    if(f1.length()==f2.length())
    
    {
    
    int i=0;
    
    while(i<f1.length()&&f1.at(i)==f2.at(i))
    
    i++;
    
    if(i==f1.length())
    
    return true;
    
    else
    
    {
    
    return false;
    
    }
    
    }
    
    else return false;
    
    }
    
    transform dif(const string f1,const string f2)//求解f1和f2的差异集
    
    {
    
    int i=0;
    
    transform t;
    
    while(f1.at(i)==f2.at(i))//第i个相等时就转向比较i+1,直到遇到不相等时就跳出while循环
    
    i++;
    
    int j1=i;
    
    while(j1<f1.length()-1&&f1.at(j1)!=',')//从不相等的部分开始,直到遇到‘,’或到达结尾时跳出while循环
    
    j1++;
    
    if(j1-i==0)	return t;
    
    t.t_f1=f1.substr(i,j1-i);//将f1中的不相同的项截取出来放入变量t.t_f1中
    
    int j2=i;
    
    while(j2<f2.length()-1&&f2.at(j2)!=',')
    
    j2++;
    
    if(j2-i==0)	return t;
    
    t.t_f2=f2.substr(i,j2-i);//将f2中的不相同的项截取出来放入变量t.t_f2中
    
    while(t.t_f1[j1-i-1]==t.t_f2[j2-i-1])//去除相同的部分
    
    {
    
    t.t_f1.erase(j1-1-i);
    
    t.t_f2.erase(j2-i-1);
    
    j1--;
    
    j2--;
    
    }
    
    return t;
    
    }
    
    int legal(transform &t)//判断置换t是否合法
    
    {
    
    if(t.t_f1.length()==0||t.t_f2.length()==0)
    
    return 0;
    
    if(var(t.t_f2))
    
    {
    
    if(var(t.t_f1)&&(varData(t.t_f1)==varData(t.t_f2)))//不能代换合一
    
    return 0;
    
    else
    
    return 2;
    
    }
    
    if(!var(t.t_f1))//若t_f1和t_f2都不是变量,也不能合一
    
    return 0;
    
    string temp;
    
    temp=t.t_f1;
    
    t.t_f1=t.t_f2;
    
    t.t_f2=temp;//在t_f1是变量而t_f2不是变量的情况下,交换t_f1和t_f2
    
    return 1;
    
    }
    
    string varData(string s)//该函数是剥去外层括号
    
    {
    
    if(s.length()==1||s.length()==0)
    
    return s;
    
    if(s.length()>1)
    
    {
    
    int i=0;
    
    while(i<s.length()&&s.at(i)!='(')
    
    i++;
    
    int j=i;
    
    while(j<s.length()&&s.at(j)!=')')
    
    j++;
    
    string ss=s.substr(i+1,j-i-1);
    
    return varData(ss);
    
    }
    
    else
    
    {
    
    return false;
    
    }
    
    }
    
    bool var(const string s)
    
    {
    
    if(s.length()==0) return false;
    
    if(s.length()==1&&s[0]>='A'&&s[0]<='Z')
    
    return false;
    
    if(s.length()>1)
    
    {
    
    int i=0;
    
    while(i<s.length()&&s.at(i)!='(')//略过不是'('的字符
    
    i++;
    
    int j=i;
    
    while(j<s.length()&&s.at(j)!=')')//略过')'前的字符
    
    j++;
    
    string ss=s.substr(i+1,j-i-1);//取出'('和')'之间的串
    
    return var(ss);//递归调用var
    
    }
    
    else
    
    {
    
    return true;
    
    }
    
    }
    
    string change(string f,transform q)//该函数查找t_f2在f中的位置并用t_f1替代f中相应的t_f2
    
    {
    
    int i=f.find(q.t_f2);
    
    while(i<f.length())
    
    {
    
    i=f.find(q.t_f2);
    
    if(i<f.length())
    
    f=f.replace(i,q.t_f2.length(),q.t_f1);
    
    }
    
    return f;
    
    }
    

      

    转载于:https://www.cnblogs.com/xlqtlhx/p/6087799.html

    展开全文
  • AI——Lisp语言实现 合一算法

    千次阅读 2017-04-24 00:37:03
    lisp语言,实现合一算法
  • 置换与合一

    千次阅读 2017-03-09 20:22:42
    置换(substitution) 1、假元推理:由合式公式 W 1 W_1 和 W ...合一(unification) ...寻找项对变量的置换,以使两表达式一致,叫做合一(unification)。...}的最通用(最一般)的合一者(most general unifier),记为mgu。
  • 编程实现表达式合一算法,对任意两个表达式E1、E2,找出其最一般合一s [测试数据] 输入表达式: E1= P (x, f (x), g (z) )E2= P (y, f ( g (b) ), y ) 输出结果: s = { g(b)/x , g(b)/y , b/z } [实现提示] ...
  • 人工智能--合一算法

    千次阅读 2020-11-04 20:10:07
    人工智能合一算法 编写语言: lisp 运行结果 带注释的源代码 ;; 设置变量表用以判断变量 (setq varlist '(x y z)) ;; 合一函数 ;; 用例 (unify '(p a b) '(p x y)) (defun unify(e1 e2) (let (bf f1 f2 t1 t2 ...
  • 【AI学习笔记】置换、合一、归结原理

    万次阅读 多人点赞 2013-12-31 12:04:45
    3置换与合一.5归结原理.人工智能复习笔记,考试前还是没看懂,考试也来了,转过来好好看 - -  置换(substitution)  定义: 置换是一个形如{t1/v1,…, tn/vn}的有限集,其中每个vi是变量,ti是...
  • 最一般合一方法MGU:设σ是公式集F的一个合一,如果对F的任一个合一θ都存在一个置换λ,使得θ=σ°λ,则称σ是一个最一般合一。(Most General Unifier)简称MGU。 一个公式集的最一般合一是 唯一 的。 ...
  • 合一算法最新版

    2016-11-27 20:24:00
    存在最一般合一,并输出结果 { cout " mgu={ " ; int i= 0 ; for (i= 0 ;i()- 1 ;i++ ) cout [i].t_f1 " / " [i].t_f2 " , " ; cout [i].t_f1 " / " [i].t_f2 " } " endl; } else // 不存在最一般...
  • 最一般合一的特点与重要性:最一般合一的置换项较少,所产生的例示更一般化,有利于产生新的置换。在推理过程中应尽可能使用最一般合一。 如何判断公式集是否可以合一,又如何找出最一般合一最一般合一求取方法...
  • 人工智能 实现一般表示式的合一算法(分别用C++和Java实现)
  • 求解最一般合一置换的算法: 存储和检索 TELL和ASK的底层是STORE和FETCH函数, STORE(s)将s存储到知识库中, FETCH(q)所有合一置换. 比如, ASK(Knows(John, x)). 如何高效实现FETCH 可以通过谓词索引.(尝试让Knows...
  • 替换的乘法:前替换集合会被后替换集合替换,并保留后替换集合的替换,删除恒等,二义的替换 合一:一个替换将多个表达式变换成同一个表达式 最一般合一mgu:一个表达式对应多种合一替换,这些合一替换都可分解为一...
  • 人工智能导论/人工智能及其应用 期末练习题

    千次阅读 多人点赞 2021-05-12 22:15:58
    目录第二章 知识表示 第二章 知识表示 设有如下语句,请用相应的谓词公式把他们表示出来: (1)有的人喜欢梅花,有的人喜欢菊花,有的人既喜欢梅花又喜欢菊花 P(x) : x是人 L(x,y): x喜欢y ...
  • 3置换与合一.5归结原理.人工智能复习笔记  置换(substitution)  定义: 置换是一个形如{t1/v1,…, tn/vn}的有限集,其中每个vi是变量,ti是不同于vi的项(常量、变量或函数)(vi≠ti). 当i≠j时,vi≠vj...
  • 四合一技术

    千次阅读 2019-08-15 22:38:00
    首款三摄手机华为P20 Pro已经正式上市,它的那枚1/1.73英寸约4000万像素QuadBayer阵列的CMOS也...所谓Quad Bayer阵列,就是将四个同色像素排列在一起,形成一个大的像素,也就是通常所说的四像素合一技术。依靠这项...
  • 人工智能导论练习题(下)

    千次阅读 2021-03-04 15:48:46
    设有替换,θ={ f(y)/x, z/y },λ={ a/y, b/z },求: θ·λ是 {f(a)/x,b/y,b/z} 三、判断题 1.(T)任何一个可合一的非空有限公式集一定存在最一般合一 2.(F)最一般合一是唯一的 3.(T)最一般合一者:置换最少,...
  • 人工智能原理笔记------确定性推理

    千次阅读 2019-04-21 11:37:39
    如果对F的任一个合一者(合一置换)θ都存在一个置换λ,使得θ=σλ,则称σ是F的最一般合一者。 一个公式集的最一般合一者是唯一的 合一算法 差异集合:设有一非空有限公式集合 F={F1, F2,…,Fn} , 从F中各个...
  • 一、【Office Professional Plus 2016包含常用的word、excel、powerpoint】 1、Office Professional Plus 2016 (x86 and x64) - DVD (Chinese-Simplified) 文件名:...
  • 在棋子、局面和性能标准 P 之间建立联系,然后就可以将P描述成一个和棋子、局面相关的函数,根据已有数据(经验E)去求解P中相关参数的优解。 我们再来看一个栗子:由身高预测体重,首先我们收集了一些人的身高和...
  • 没毛病,还是散点图,在代码中注释了bx.plot(x_data, prediction_value,'r-',lw=1),一般情况下用plot画线图,而用scatter画散点图,前者是直接将散点连成光滑的曲线,同样的30个点,用plot效果如下: 这也是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,802
精华内容 4,720
关键字:

最一般合一