相关疑难解决方法(0)

AUBUC的Prolog联盟

我最近开始学习Prolog,我无法解决如何组合三个列表的问题.

我能够组合2个列表:

%element
element(X,[X|_]).
element(X,[_|Y]):-
               element(X,Y).

%union

union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

list prolog

20
推荐指数
2
解决办法
2605
查看次数

使用\ ==/2或dif/2

如果我想确保两个变量不实例化到同一个术语,那么首选方法是什么?

假设我需要在图中找到有向边,并且节点不能有自己的边:

node(a, x, y). node(b, z, x). node(c, y, y).
Run Code Online (Sandbox Code Playgroud)

(这里的边是 - > c,b - > a,但不是 c - > c)

以下作品:

edge(A, B) :- node(A, _, X), node(B, X, _), A \== B.
Run Code Online (Sandbox Code Playgroud)

这也有效[swi-prolog]:

edge(A, B) :- dif(A, B), node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

这显然不起作用(因为A和B都没有被实例化?):

edge(A, B) :- A \== B, node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

我想我的第一个解决方案的问题是,使用更复杂的node谓词,在edge失败之前可能会发生许多不必要的统一.在dif另一方面,是在图书馆,这表明它并不意味着在这种简单的情况下使用(虽然它,我似乎在寻找精确的功能).

prolog prolog-dif logical-purity

16
推荐指数
3
解决办法
2002
查看次数

Prolog - 计算列表中的重复次数

我正在尝试查看列表并计算给定单词出现的次数.到目前为止我有这个:

count_repetitions([_], [], 0).
count_repetitions([Word], [Word|Tail], Count):-
   count_repetitions([Word], Tail, X), 
   Count is X + 1.
count_repetitions([Word], [Z|Tail], Count):-
   Word \= Z, 
   count_repetitions([Word], Tail, Count).
Run Code Online (Sandbox Code Playgroud)

所以查询?- count_repetitions([yes],[yes,and,yes,and,no], X).会给出X = 2.

这似乎有效.现在我需要编写一个谓词,在表单中输出一个包含搜索词及其出现次数的列表X = [(yes - 2)].我完全陷入困境,有什么建议吗?

list prolog

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

标签 统计

prolog ×3

list ×2

logical-purity ×1

prolog-dif ×1