标签: prolog

快速在Prolog中运行

我的公司有一个在Prolog运行的项目,我想澄清一些关于如何学习它的事情.我知道Prolog与众不同.它不应该像任何其他语言一样学习.

话虽如此,考虑到我还没有把手放在任何Prolog书上,有没有书或在线资源,我可以在哪里学习Prolog我们学习C/C++的方式?我的意思是,只要是在C/C++的操作,你只需要知道程序的结构,比如main { },loops,conditions,branches,很少functions,你可以用它来启动在C/C编写的基本程序++.

就这样我可以学习Prolog吗?是否有任何书只是让我知道如何在Prolog中编程?(基础知识,循环,如何实现条件,程序结构,什么是谓词?如何使用它?如何定义它?等等......).

logic predicate prolog

12
推荐指数
3
解决办法
2099
查看次数

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].我需要从这里检索最小值并将其乘以一个数量.有人可以建议如何检索最小值?谢谢!

traversal list prolog minimum

12
推荐指数
3
解决办法
4万
查看次数

Prolog意味着否定的谓词

如何在PROLOG中编写以下规则:如果P则不是Q.

我明白你可以很容易地写,如果P然后Q谓词喜欢q(X) :- p(X),但你怎么能否定q/1谓词?我不想用其他语义来定义新的谓词non_q/1.

prolog negate implication

12
推荐指数
2
解决办法
3万
查看次数

Prolog:在列表中,找到给定元素后面的元素

我最近开始在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)

list prolog

12
推荐指数
2
解决办法
2632
查看次数

执行swi-prolog和其他列表元素的操作

如何按顺序对列表中的每个元素执行操作?

基于这两个资源:

  1. http://www.swi-prolog.org/pldoc/doc/swi/library/lists.pl
  2. http://www.swi-prolog.org/pldoc/doc_for?object=foreach/2

我想我总是可以依靠:

  • foreach(member(X, [1,2]), write(X)).

这是确定性的,我可以在我自己的谓词中包装成员/ 2谓词,并且仍然按顺序迭代吗?

prolog

12
推荐指数
1
解决办法
2万
查看次数

在Prolog中不相等而不统一

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

12
推荐指数
1
解决办法
3万
查看次数

在Prolog中定义图形:边缘和路径,查找两个顶点之间是否存在路径

我是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存在一条路径ZY(某种递归)时,顶点和顶点之间才有路径.

这对于呈现的图表是否正确?当我问Prolog关于顶点A和顶点之间的路径时,F它给了我true......这甚至都不对!这段代码可能有什么问题?

graph prolog transitive-closure

12
推荐指数
3
解决办法
2万
查看次数

排除列表中所有出现的最小数量

作为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)

list prolog

12
推荐指数
1
解决办法
373
查看次数

坚定性:定义及其与逻辑纯度和终止的关系

到目前为止,我一直坚持 Prolog程序意味着:

如果对于一个查询Q,有一个subterm S,使得存在一个术语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 non-termination logical-purity steadfastness

12
推荐指数
1
解决办法
296
查看次数

Prolog中的"semidet"概念是否已解决?

作为Prolog的新手,我在2012年末遇到了一个非常有趣的讨论.我注意到当时在Prolog社区中有两个"semidet"概念,即:

  1. 计算最多成功一次.
  2. 一种计算,一旦成功,就不会留下任何选择点.

显然,第二个意味着第一个,但反之则不然.

阅读帖子,我明白第一个是Dr.Neumerkel的概念,第二个是Drs.Wielemaker,O'Keefe和其他人.

谷歌搜索,我看到一些数据库研究人员的意思是'半确定'一个查询,它最多可以回答一个等价类,更接近第一个概念.

Dr.Neumerkel说(参考call_semidet那里的谓词):

实施可能会得到改进,但在优化和标记之前,需要解决实际意义.

那么,意义已经解决了吗?

'det'怎么样?

习惯上根据解决方案的数量对谓词进行分类.根据SWI-Prolog的定义(见下文),'det'可以进行完全非确定性(比如并行)计算,只要它提交到现在保证存在的解决方案.因此,通过类比我猜可能有两个'det'的概念:

  1. 一次成功的计算.
  2. 这正是成功的一次计算其一旦成功,没有留下的选择点.

第一个更符合逻辑,但在计算结束之前一般都是不可判定的.一旦找到解决方案,第二个很容易判定,但程序及其含义取决于Prolog采用的特定搜索策略,即深度优先搜索.

我想知道是否还没有社区的共识?为什么不区别这两个不同的概念呢?

以下是上面SWI-Prolog页面的摘录:

det [determinism]

确定性的缩写.

确定性

如果谓词在没有离开选择点的情况下成功完成一次,则谓词是确定性的.

semidet

半确定性的简写.

半确定性的

半确定性的谓词要么失败要么在没有选择点的情况下成功完成一次.另见确定性.

prolog

12
推荐指数
2
解决办法
400
查看次数