我有一个方法长度(列表,var),它给了我一个列表的长度,但我想找到一个字符串的长度,任何人有一个解决方案?
我在SWI-PL文档中遇到过几次键值对,但无法得到关于它们的好信息.这是prolog中的标准内容还是仅仅是swi pl扩展?主要在这里找到:http ://www.swi-prolog.org/pldoc/doc_for?object= keysort/2和这里:http://www.swi-prolog.org/pldoc/doc_for? object= section%282, %27A.3%27,SWI%28%27/DOC /手动/ assoc.html%27%29%29
对的形式例如是a-5,或者在列表[a-5,b-7]中.
如果它是标准的,那么使用它们还有附加价值吗?他们的兴趣是什么?提前致谢 :)
我是prolog的新手并且正在努力学习如何编程.我想知道如何x^y在Prolog中计算都是整数.
我知道事实是这样的事情:
% exp(y,x,z) <- z is x**y
Run Code Online (Sandbox Code Playgroud) 我最近在学习Prolog,发现用于定义中缀运算符的三种类型令人困惑。
指定运算符的类型时,xfx,xfy和yfx有什么区别?我已经搜索了这个问题,但没有发现任何有用的信息。
我尝试在Prolog中键入以下代码:
:- op(500,yfx,is_alive).
is_alive(A,B) :- display([A,B]).
:- op(500,xfy,is_alive2).
is_alive2(A,B) :- display([A,B]).
:- op(500,xfx,is_alive3).
is_alive3(A,B) :- display([A,B]).
Run Code Online (Sandbox Code Playgroud)
和输出:
| ?- 1 is_alive 2.
'.'(1,'.'(2,[]))
yes
| ?- 1 is_alive2 2.
'.'(1,'.'(2,[]))
yes
| ?- 1 is_alive3 2.
'.'(1,'.'(2,[]))
yes
Run Code Online (Sandbox Code Playgroud)
结果对我来说没有区别。
我想知道如何基于另一个列表中的现有原子在列表中生成新原子.给出清单:
L=[a,b,c,d]
Run Code Online (Sandbox Code Playgroud)
我想制作一个新列表,例如:
P=[a_,b_,c_,d_]
Run Code Online (Sandbox Code Playgroud)
换句话说,类似于字符串添加的东西,例如
String str1 = str2 + "_";
Run Code Online (Sandbox Code Playgroud) 对于Java和C等允许使用运算符(即中缀)的语法糖的语言,它们使用优先级和关联性.
Prolog也使用关联性:
左关联 - yfx
右关联 - xfy
但为什么有xfx?
我在互联网上找到的唯一更清晰的东西是
xfx表示运算符在其分支上"支配",而xfy或yfx代表"列表构造",意思是允许链接具有相同优先级的表达式.
如果答案可以包括需要xfx的示例,因为xfy和yfx失败/没有意义,那将是值得赞赏的.
对于Prolog参考:Prolog内置指令op
作为虚假记录:
请注意,您在上述链接中提供的运算符与标准和SWI不同!它们已经过时了至少10年.作为一个例子,它应该是
current_op(200,fy,-).
在阅读CapelliC的两个当前答案并且错误后,很明显非关联是找到更多相关信息的关键词.因此,当关注非关联部分时,运算符关联现在对xfx更有意义.
我正在努力克服throw/1的精确语义,而没有ISO Prolog中合适的catch/3.我正在阅读ISO Prolog规范,在我看来,执行将以无限递归结束.
(请注意,您必须能够访问ISO Prolog标准才能解释此问题).
步骤1.假设我们调用throw(未知),并且堆栈上没有catch/3.
步骤2.它将在7.8.10.1 c)结束,说它将是一个系统错误(7.12.2 j).
第3步.这是在其他地方用于其他地方的同一种配方,所以我认为它应该以相同的方式解释.因此7.12.1适用,并且当前目标(throw/1)将被throw替换(error(system_error,Imp_def)).
步骤4.执行此目标将在堆栈上找不到活动的"catch".因此,它应该尝试相同的步骤,继续步骤2,依此类推=>无限递归.
你可能会说未被捕获的"throw"转换为system_error是"最终的"并且不会像其他错误一样进一步处理,并且它可能必须如此,以避免我描述的问题,但我的问题是,标准在哪里涵盖?
其他一些注释,为了完整性:
7.12.2中的注4也提到了在这种情况下出现系统错误的可能性.我认为那里使用的公式("......没有活跃的目标捕获/ 3")在另一个方面引入了一些混淆,因为它应该符合条件,即捕手必须与错误术语统一(B ).
将未捕获的throw-s转换为系统错误背后的想法是什么?它看起来可能存在,使Prolog处理器的顶级生活"更容易",因此它只能收到一个可预测的错误?对我而言,这带来的问题多于好处 - 错误的真正原因因此消失 - 任何意见或评论?
形式语义(附件A)似乎也以某种方式与此斗争,尽管我没有详细研究它.在A.2.5,它提到,"...然而,在正式规范有在根捕手...",并且涉及它,例如,向的findall/3的执行.那么正式的规范与正文有何不同?
Prolog 中的数字比较运算符与其他语言几乎相同。
| 操作员 | 意义 |
|---|---|
X > Y |
X 大于 Y |
X < Y |
X 小于 Y |
X >= Y |
X 大于或等于 Y |
X =< Y( 不是<=) |
X 小于或等于 Y |
问题:为什么 prolog 与大多数其他语言不同并且使用=<and not <=?
原因是由于此类符号是如何手写的,因此经常引用从右到左:-的含义含义的解释。<-
更新 - 编辑以纠正拼写错误
我在代码中看到像这样使用的斜杠:
solution([X/Y|Others]) :-
noattack(X/Y, Others).
Run Code Online (Sandbox Code Playgroud)
但有时我会在Prolog中看到"/ 1""/ 2"等.
这些陈述(字符)是什么意思?
我已经定义了!(阶乘)函数并将其注册为算术函数和运算符,以便可以执行:A是6!。
现在我要定义!(奇数阶乘),但方法相同-编写子句,注册算术函数和运算符,调用A为7!-结果为SyntaxError:应为运算符
如果可能的话,我该如何注册!操作员?
是的,我知道,!通常是削减。
在试图理解该类型的中缀运算符xfy并且yfx具有相同的优先级和顺序时,我看到只有四种组合.
运用
a = xfy right-associative
b = yfx left-associative
Run Code Online (Sandbox Code Playgroud)
有
aa e.g. 1 xfy 2 xfy 3 e.g. 1 ^ 2 ^ 3
ab e.g. 1 xfy 2 yfx 3
ba e.g. 1 yfx 2 xfy 3
bb e.g. 1 yfx 2 yfx 3 e.g. 1 - 2 - 3
Run Code Online (Sandbox Code Playgroud)
现在对于(xfy xfy)aa,运算符都是正确关联的.
对于(yfx yfx)bb,运营商都是左联盟.
但是对于(xfy yfx)ab ,(xfy)a运算符是右关联的,而(yfx)b运算符是左关联的.如果我理解正确,Prolog将评估为:
使用优先权500和x意义<和y意义 …
在这里的介绍中,它指出Prolog的ISO模块标准是失败的.任何人都可以详细说明这个吗?