我的任务是在Prolog中实现一个版本的findall而不使用任何Prolog内置函数,除了not和cut - 所以基本上是纯Prolog.
我正在尝试在树中搜索所有直接后代并将结果返回到列表中
parent(a, b).
parent(b, c).
parent(b, d).
parent(e, d).
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是:
find(X, L) :- find2(X, [], L).
find2(X, Acc, L) :- parent(Y, X), find2(Y, [Y|Acc], L).
find2(_, Acc, Acc).
Run Code Online (Sandbox Code Playgroud)
我输入的时候想要的是:
find(a,X).
Run Code Online (Sandbox Code Playgroud)
将会:
X = [b, c, d]
Run Code Online (Sandbox Code Playgroud)
(顺序不重要)
但是我得到了:
X = [b, c] ;
X = [b, d] ;
X = [b] ;
X = [].
Run Code Online (Sandbox Code Playgroud)
我是Prolog的新手,所以对此有任何帮助都会非常感激.
谢谢
当我的朋友开始在学校学习Prolog时,我取笑他学习一种无用的语言.然而,他向我展示了一些我从未知道的东西; 我想知道这种技术的来源.
技术是这样的:
permutation(List) :-
isAMember(X, List),
deleteFirstElement(X, List, Substring),
% and so on
Run Code Online (Sandbox Code Playgroud)
在这段代码中,isAMember(X, List)
是一个函数,如果X
在,则返回true List
.然而,到现在为止X
没有被定义为一个变量- 这样的计划将产生一堆新的线程,每一个可能的值X
,使isAMember(X, List)
真实的,并从那里继续.
这使我们能够以我能想象到的最简单,最优雅的方式创建多线程算法.
所以我的问题是: 这是Prolog特定的,还是所有逻辑和/或功能语言的特征? 另外,我在哪里可以学到更多这样令人惊叹的多线程技术 - 这无疑是编程的未来.
multithreading functional-programming prolog logic-programming