标签: prolog

逻辑语言 - Prolog或Lisp/Smalltalk还是其他什么?

所以,我正在编写某种统计程序(实际上我正在将它重新设计为更优雅的东西)而且我应该使用为这种东西创建的语言(处理大量的统计数据,它们之间的连接和一些缺乏遗传/神经编程).

说实话,我只是想借口潜入lisp/smalltalk(不是smalltalk/lisp/clojure一样吗? - 比如python和ruby? - 语义 - 但是我也想要一种易于理解的语言其他喜欢BASIC语言的人(这就是为什么我没有选择LISP - 但是:D).

我还检查了Prolog,它似乎是一种非常酷的语言(容易在数据之间建立关系,比Lisp更容易),但我想听听你的想法.

谢谢

编辑:我总是把常见的lisp与smalltalk混淆.很抱歉把这两个郎放在一起.我所说的" 喜欢BASIC语言的其他人 "的意思是我不喜欢像lisp这样的语言语言(对于没有CS背景的人)而且我觉得Prolog更直观一些(但那是我的我刚刚与他们两个人搞砸了之后的意见).

lisp statistics prolog

11
推荐指数
2
解决办法
3220
查看次数

使用Prolog解决逻辑谜题

罪犯是A,B,C和D之一.

A说:"这不是我"
B说:"它是D"
C说:"它是B"
D说:"这不是我"

而且我们知道其中只有一个说实话.

谁是谁?我想用Prolog来解决它.

这是一个面试问题.

puzzle prolog

11
推荐指数
3
解决办法
6050
查看次数

Prolog初学者 - 这是一个坏主意吗?

我正在处理的应用程序是各种各样的"配置器".它是用C#编写的,我甚至编写了一个规则引擎来配合它.这个想法是有一堆命题逻辑语句,用户可以进行选择.根据他们选择的内容,其他一些项目变得必需或完全不可用.

命题逻辑语句通常采用以下形式:

A => ~X 
ABC => ~(X+Y) 
A+B => Q 
A(~(B+C)) => ~Q A <=> B
Run Code Online (Sandbox Code Playgroud)

符号:

=>  -- Implication
<=> -- Material Equivalence
~   -- Not
+   -- Or
Two letters side-by-side -- And
Run Code Online (Sandbox Code Playgroud)

我对Prolog很新,但似乎它可以为我处理所有"规则处理",允许我摆脱目前的规则引擎(它可以工作,但它不是那么快或容易按照我的意愿保持).

此外,所有可用选项都属于层次结构.例如:

Outside
   Color
      Red
      Blue
      Green
   Material
      Wood
      Metal
Run Code Online (Sandbox Code Playgroud)

如果暗示了第二级(特征,如颜色)的项目,则必须选择第三级的项目(选项,例如红色).同样,如果我们知道某个功能是假的,那么它下面的所有选项也都是假的.

问题在于每个产品都有自己的一套规则.设置包含这些运算符作为谓词的知识库是一种合理的方法,然后在运行时开始构建产品的所有规则吗?

我想象它可能会起作用的方式是建立组件,功能和选项的想法.然后设置then之间的关系(例如,如果该功能为false,则其所有选项均为false).在运行时,添加产品的特定规则.然后将所有用户的选择传递给一个函数,检索哪些项为真,哪些项为假.

我不知道我所要求的所有含义,因为我刚刚进入Prolog,但我正试图避免走上一条糟糕的道路,并在此过程中浪费大量时间.

一些问题可能有助于针对我想要找到的内容:

  1. 这听起来有效吗?
  2. 我吠叫错了树吗?
  3. 尝试在运行时创建所有这些规则有任何缺点或顾虑吗?
  4. 有没有一个更好的系统来支持这种事情,我可能会挤进一个C#应用程序(Silverlight,确切地说)?
  5. 我还应该检查其他竞争系统吗?
  6. 你对这类事有什么一般的建议吗?

提前感谢您的建议!

logic boolean-logic inference rule-engine prolog

11
推荐指数
1
解决办法
638
查看次数

Prolog阶乘递归

我无法理解以下因子程序

fact1(0,Result) :-
    Result is 1.
fact1(N,Result) :-
    N > 0,
    N1 is N-1,
    fact1(N1,Result1),
    Result is Result1*N.
Run Code Online (Sandbox Code Playgroud)

什么时候fact1被称为嵌套在第二行fact1,这是不是意味着最后一行,Result is Result1*N.永远不会被调用?或者在Prolog中,最后一行是在递归调用之前执行的吗?

recursion prolog factorial

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

列出不等式约束

我正在尝试编写一个Prolog(CLP)谓词,它将建立约束两个列表不等式的约束.

更正式地说,有两个列表A=[A1,...,AN], B=[B1,...,BN],约束被定义为(A1 #\= B1) #\/ (A2 #\= B2) #\/ ... #\/ (AN #\= BN).

我不确定如何在给定两个任意长度的列表的情况下构建此约束.这是我的尝试.我明白为什么它不起作用,但无法修复它.

any_different([], []).
any_different([H1|T1], [H2|T2]):-
    H1 #\= H2 #\/ any_different(T1, T2).
Run Code Online (Sandbox Code Playgroud)

prolog clpfd

11
推荐指数
1
解决办法
386
查看次数

列表上的成对关系

如果给定关系的列表元素的所有对都为真,则以下高阶谓词成功.对于这种关系,是否存在共同的或更好的,更具意图的名称?

我对这个名字的最初动机是,在all_different/1,如果元素成对不同,通常会有一个被描述为真的约束.事实上,更倾向于说元素都是不同的,但我经常纠正(由Prolog程序员同意)使用pairwise不同.事实上,这种约束现在最自然地表达为pairwise(#\=, Zs).

pairwise(Rel_2, Xs) :-
   i_pairwise(Xs, Rel_2).

i_pairwise([], _).
i_pairwise([X|Xs], Rel_2) :-
   maplist(call(Rel_2,X),Xs),
   i_pairwise(Xs, Rel_2).
Run Code Online (Sandbox Code Playgroud)

正如@aBathologist所观察到的,成对不是正确的词,因为它也可能对非反身有意义Rel.

此外,关系Rel不是一个完整的关系,因为call(Rel, X, X)可能会失败,但pairwise(Rel, Xs)仍然可以成功.

我甚至还在鼓励(a->a->Bool)->[a]->Bool.但是Hayoo 发现它:名字pairwise与逐点相反.

看MO和数学:

terminology prolog meta-predicate

11
推荐指数
1
解决办法
493
查看次数

究竟什么是"逻辑变量",实现语言功能的一般方法是什么?

我正在尝试编写玩具逻辑编程查询语言,基于各种指令来源,包括SICP和Prolog的艺术(AoP).我刚刚开始研究统一算法的第一个草图(根据AoP的"逻辑编程计算模型的核心"),AoP指出

当为特定逻辑编程语言实现统一算法时,避免了堆栈和统一器上的等式中的显式替换.相反,逻辑变量和其他术语由具有不同值的存储器单元表示,并且通过将表示逻辑变量的存储器单元分配给包含变量所绑定的术语的表示的单元来实现变量绑定.(第1版,第71页)

阅读这篇文章让我意识到我对逻辑变量的工作方式只有粗略而实际的把握,但我并不真正理解它们是如何实现的.我甚至不确定将逻辑变量与声明性编程范例的其他区域中的不可变变量区分开来的精确,形式特征是什么.我将感激所有有启发性的解释和有益的参考.

prolog

11
推荐指数
1
解决办法
820
查看次数

制定效果公理

如何使用谓词包含(b,l,t)正确地写出空(b,t)-action的效果公理如果桶b在时间t保持l升水,则谓词评估为True.

空(b,t):在时间t完全清空桶b.在时间t + 1可以看到转移的影响

转移(b,b',t):尽可能多的水从桶b转移到桶b',而不会在时间t溢出任何开始.在时间t + 1可以看到转移的影响.

铲斗1装满水并容纳7升水.铲斗2是空的并且容纳3升.目标状态是b2含有1升水.

我会说正确的解决方案是:

to any b,t,l( empty(b,t) -> contains(b,l,t))
Run Code Online (Sandbox Code Playgroud)

这是正确的还是我应该将升的数量设置为l = 5,例如?

logic artificial-intelligence prolog axiom clpfd

11
推荐指数
2
解决办法
283
查看次数

Prolog解包列出谓词

嘿伙计,所以我试图创造一些像这样的工作:

?- unpacking([[1], [1,2], [3]], Lst1, NewLst).
NewLst=[1,3]
Run Code Online (Sandbox Code Playgroud)

我这样写的:

unpacking([], Lst1, Lst1).
unpacking([[H]|T], Lst1, NewLst):-
    append([H], Lst2),
    unpacking(T, Lst2, NewLst).
unpacking([_|T], Lst1, NewLst):-
    unpacking(T, Lst1, NewLst).
Run Code Online (Sandbox Code Playgroud)

我知道我做错了什么,但是,我是在Prolog开始所以,需要从我的错误中吸取教训:)

prolog

11
推荐指数
4
解决办法
551
查看次数

Prolog递归地用另一个列表的元素替换list的元素

对标题不清晰表示歉意.以下是我正在构建的一个非常具体的谓词,它只是部分按预期工作.

% replace_elements(+SearchingElementsList,+ReplacementsList,+OriginalList,-ResultingList).
% ResultingList consists of all elements of SearchingElementsList replaced by elements of ReplacementsList respectively.

replace_elements([],[],_,_).
replace_elements([H|T],[H2|T2],[H3|T3],List) :-
    H \= H3,                                 % H is not H3, therefore
    replace_elements([H|T],[H2|T2],T3,List). % Skip this element and continue with T3.
replace_elements([H|T],[H2|T2],[H|T3],[H2|List]) :-
    replace_elements(T,T2,T3,List).          % H is found in OriginalList. Continue with tails.
Run Code Online (Sandbox Code Playgroud)

目前:

?- replace_elements([1,2,3],[one,two,three],[1,2,3,4,5],Result).
?- Result = [one,two,three|_7636].
Run Code Online (Sandbox Code Playgroud)

预期:

?- Result = [one,two,three,4,5].
Run Code Online (Sandbox Code Playgroud)

任何提示将不胜感激!

编辑:为我的具体问题提出了一个有效的答案.

% Eventually, recursion starts from all empty lists.
replace_elements([],[],[],[]).
% Rules are empty, push remaining H …
Run Code Online (Sandbox Code Playgroud)

recursion prolog

11
推荐指数
3
解决办法
644
查看次数