我的公司有一个在Prolog运行的项目,我想澄清一些关于如何学习它的事情.我知道Prolog与众不同.它不应该像任何其他语言一样学习.
话虽如此,考虑到我还没有把手放在任何Prolog书上,有没有书或在线资源,我可以在哪里学习Prolog我们学习C/C++的方式?我的意思是,只要是在C/C++的操作,你只需要知道程序的结构,比如main { }
,loops
,conditions
,branches
,很少functions
,你可以用它来启动在C/C编写的基本程序++.
就这样我可以学习Prolog吗?是否有任何书只是让我知道如何在Prolog中编程?(基础知识,循环,如何实现条件,程序结构,什么是谓词?如何使用它?如何定义它?等等......).
简而言之:如何在列表中找到最小值?(感谢kaarel的建议)
很长的故事:
我在amzi prolog中创建了一个加权图并给出了2个节点,我能够检索路径列表.但是,我需要在此路径中找到最小值,但无法遍历列表来执行此操作.我可以请您就如何确定清单中的最小值寻求建议吗?
我的代码目前看起来像这样:
arc(1,2). arc(2,3). arc(3,4). arc(3,5). arc(3,6). arc(2,5). arc(5,6). arc(2,6). path(X,Z,A) :- (arc(X,Y),path(Y,Z,A1),A is A1+1;arc(X,Z), A is 1).
因此,"键入findall(Z,路径(2,6,Z),L)." 在听众中允许我获得一个列表[3,2,2,1].我需要从这里检索最小值并将其乘以一个数量.有人可以建议如何检索最小值?谢谢!
如何在PROLOG中编写以下规则:如果P则不是Q.
我明白你可以很容易地写,如果P然后Q谓词喜欢q(X) :- p(X)
,但你怎么能否定q/1
谓词?我不想用其他语义来定义新的谓词non_q/1
.
我最近开始在Prolog中编程,并且我正在尝试创建在列表中的给定元素之后找到元素的规则.例如,我想find(2,X,[1,2,3,4]).
结果3
.
我到目前为止的尝试:
find(X,Y,[X,Y|Tail]):-
!.
find(X,Y,[_|Tail]):-
find(X,Y,Tail).
Run Code Online (Sandbox Code Playgroud) 如何按顺序对列表中的每个元素执行操作?
基于这两个资源:
我想我总是可以依靠:
foreach(member(X, [1,2]), write(X)).
这是确定性的,我可以在我自己的谓词中包装成员/ 2谓词,并且仍然按顺序迭代吗?
Prolog中A\= B与否(A == B)之间有什么区别?
我发现这个http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse5 和这个wiki页面 http://en.wikibooks.org/wiki/Prolog/Built-in_predicates 但它没有帮助我,因为没有澄清差异,也没有简短的意义\ =.
谢谢.
我是Prolog的新手.我graph.pl
在下图中定义:
这是我的Prolog代码:
edge(a,e).
edge(e,d).
edge(d,c).
edge(c,b).
edge(b,a).
edge(d,a).
edge(e,c).
edge(f,b).
path(X,X).
path(X,Y):- edge(X,Z) ; path(Z,Y).
Run Code Online (Sandbox Code Playgroud)
我理解如下:只有在顶点X
和顶点之间Y
存在边缘且顶点X
和顶点之间Z
存在一条路径Z
Y
(某种递归)时,顶点和顶点之间才有路径.
这对于呈现的图表是否正确?当我问Prolog关于顶点A
和顶点之间的路径时,F
它给了我true
......这甚至都不对!这段代码可能有什么问题?
作为Prolog新手,我尝试定义一个谓词filter_min/2
,该谓词采用两个列表来确定第二个列表是否与第一个列表相同,但是删除了所有出现的最小值.
具有预期结果的示例查询:
?- filter_min([3,2,7,8], N).
N = [3,7,8].
?- filter_min([3,2,7,8], [3,7,8]).
true.
Run Code Online (Sandbox Code Playgroud)
我试过但总是得到相同的结果:false
.我不知道问题是什么.我需要帮助!
这是我的代码:
filter_min(X,Y) :-
X == [],
write("ERROR: List parameter is empty!"),
!;
min_list(X,Z),
filter(X,Y,Z).
filter([],[],0).
filter([H1|T1],[H2|T2],Z) :-
\+ number(H1),
write("ERROR: List parameter contains a non-number element"),
!;
H1 \= Z -> H2 is H1, filter(T1,T2,Z);
filter(T1,T2,Z).
Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直坚持 Prolog程序意味着:
如果对于一个查询
Q
,有一个subtermS
,使得存在一个术语T
,使?- S=T, Q.
成功虽然?- Q, S=T.
失败,然后通过调用一个谓词Q
是不踏实.
直觉上,我因此坚定地表示我们不能使用实例化来"欺骗"谓词来提供解决方案,否则这些解决方案不仅不会被给予,而是被拒绝.注意非终止程序的区别!
特别是,至少在我看来,逻辑纯度总是意味着坚定不移.
例子.为了更好地理解坚定性的概念,考虑这个属性的几乎经典的反例,在将高级学生引入Prolog的操作方面时经常引用,使用两个整数之间关系的错误定义及其最大值:
integer_integer_maximum(X, Y, Y) :- Y >= X, !. integer_integer_maximum(X, _, X).
这个中的一个明显错误 - 我们应该说" 摇摆不定 " - 定义当然是以下查询错误地成功:
?- M = 0, integer_integer_maximum(0, 1, M). M = 0. % wrong!
而交换目标产生了正确的答案:
?- integer_integer_maximum(0, 1, M), M = 0. false.
这个问题的一个很好的解决方案是依靠 …
作为Prolog的新手,我在2012年末遇到了一个非常有趣的讨论.我注意到当时在Prolog社区中有两个"semidet"概念,即:
显然,第二个意味着第一个,但反之则不然.
阅读帖子,我明白第一个是Dr.Neumerkel的概念,第二个是Drs.Wielemaker,O'Keefe和其他人.
谷歌搜索,我看到一些数据库研究人员的意思是'半确定'一个查询,它最多可以回答一个等价类,更接近第一个概念.
Dr.Neumerkel说(参考call_semidet
那里的谓词):
实施可能会得到改进,但在优化和标记之前,需要解决实际意义.
那么,意义已经解决了吗?
习惯上根据解决方案的数量对谓词进行分类.根据SWI-Prolog的定义(见下文),'det'可以进行完全非确定性(比如并行)计算,只要它提交到现在保证存在的解决方案.因此,通过类比我猜可能有两个'det'的概念:
第一个更符合逻辑,但在计算结束之前一般都是不可判定的.一旦找到解决方案,第二个很容易判定,但程序及其含义取决于Prolog采用的特定搜索策略,即深度优先搜索.
我想知道是否还没有社区的共识?为什么不区别这两个不同的概念呢?
以下是上面SWI-Prolog页面的摘录:
det [determinism]
确定性的缩写.
确定性
如果谓词在没有离开选择点的情况下成功完成一次,则谓词是确定性的.
semidet
半确定性的简写.
半确定性的
半确定性的谓词要么失败要么在没有选择点的情况下成功完成一次.另见确定性.