prolog - 序言中的连续演算
问题描述
我真的是 Prolog 的新手。我必须在 Prolog 中编写连续微积分的规则,我认为我做得对。如果公式有效,代码应返回 true,否则返回 false。这是我的代码:
如果公式有效,则返回 true。
但是,如果我使用无效的公式运行代码,它永远不会结束,我真的不知道如何修复它。
查询-? sc([ ],[ (neg ((neg p)or neg (neg p)))]).
应返回 false,因为该公式无效。
我将不胜感激。
解决方案
析取规则有错误。此外,排列规则是一个结构规则:
G, A, B, D |- C
---------------
G, B, A, D |- C
你应该编码它,这样它就不会循环。但现在这完全可以发生。有一个简单的技巧,也许你想实现它,只将非原子交换到前面。
这是一个清理后的版本:
:- use_module(library(basic/lists)).
sc([neg(A)|L],R) :- !, sc(L,[A|R]).
sc(L,[neg(A)|R]) :- !, sc([A|L],R).
sc(L,[or(A,B)|R]) :- !, sc(L,[A,B|R]).
sc([or(A,B)|L],R) :- !, sc([A|L],R), sc([B|L],R).
sc([A|L],R) :- atom(A), select(B,L,H), compound(B), !, sc([B,A|H],R).
sc(L,[A|R]) :- atom(A), select(B,R,H), compound(B), !, sc(L,[B,A|H]).
sc(L,R) :- member(A,L), member(A,R), !.
这里有一些运行:
Jekejeke Prolog 3, Runtime Library 1.3.5
(c) 1985-2019, XLOG Technologies GmbH, Switzerland
?- sc([],[neg(or(neg(p),neg(neg(p))))]).
No
?- sc([],[or(neg(p),neg(neg(p)))]).
Yes
备注:我已经把身份规则移到最后,所以它只会命中原子。我已经放置了削减,这是由一些经典逻辑的反转引理证明的。可能不适用于其他逻辑或出现非接地问题时。
推荐阅读
- matplotlib - 将图保存为 .eps 时,灰色 matpotlib 图面颜色变为黑色
- c# - Xamarin Android 布局将图像右对齐
- c++ - CMake:基于 Clang 的 Linux 交叉编译使用错误的目标平台
- python - 使用 matplotlib 和 geopandas 在地图上用不同的投影注释标签时遇到问题
- pytorch - Pytorch 用户对旧 GPU 的警告
- html - How to set color from API response in border-color in Angular?
- python - 按钮 tkinter python 周围的选择框
- node.js - 将图像字段添加到现有表单并将其上传并检索到 React.js+Node.js+MSSQL 应用程序中的数据库
- java - 有没有一种方法可以通过使用 Cursor 和 Uri 将歌曲导入其中来在 ListView 中播放歌曲?
- java - 为什么 Java Debugger 会随机进入内部方法?