相关疑难解决方法(0)

将谓词应用于列表元素的Prolog映射过程

如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素的Prolog过程,并将List结果返回到列表中Result

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Run Code Online (Sandbox Code Playgroud)

prolog meta-predicate map-function

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

列表上的成对关系

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

我对这个名字的最初动机是,在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
查看次数

Prolog:一个人是自己的兄弟姐妹?

我在理解为什么我的prolog代码根据我的规则的顺序做了一些事情时遇到了一些麻烦.

这是我的数据库:

parent(tom, bob).
parent(tom, liz).
parent(mary, bob).
parent(mary, liz).

male(tom).
male(bob).
female(mary).
female(liz).
Run Code Online (Sandbox Code Playgroud)

以下是规则:

%difference(X, Y) ==> Predicate to check if two people X and Y are not the same person.
difference(X, Y) :- \==(X, Y).
father(X, Y) :- male(X), parent(X, Y), difference(X, Y).
mother(X, Y) :- female(X), parent(X, Y), difference(X, Y).
sibling(X, Y) :-
    difference(X, Y),
    mother(M, X), mother(M, Y),
    father(F, X), father(F, Y).
Run Code Online (Sandbox Code Playgroud)

问题是,当我这样做时,

?- sibling(bob, X).
Run Code Online (Sandbox Code Playgroud)

我明白了

X = bob ;
X = liz ;
false. …
Run Code Online (Sandbox Code Playgroud)

prolog prolog-dif

7
推荐指数
2
解决办法
1191
查看次数

检查列表中列表中的所有数字是否不同

我想在prolog中创建一个规则来检查列表中是否有重复的数字.

例如:

  • 因为[1,2,3,4]它会回来true.
  • 对于[1,2,3,3]它将返回false,因为3重复

我想出了这个规则,但它不起作用

Different([]).
Different([H|T]):-
     Member(H,T),
     Different(T).
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

prolog

6
推荐指数
2
解决办法
6380
查看次数

Prolog仅删除独特元素

我想返回一个列表,删除所有独特的元素,例如

remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).   
Q = [1,1,2,2,4,4,6,6,6].  
Run Code Online (Sandbox Code Playgroud)

我的问题是,目前我有返回的代码

remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).  
Q = [1, 2, 4, 6, 6].
Run Code Online (Sandbox Code Playgroud)

这样只返回这些非唯一值的第一个实例.这是我的代码:

remUniqueVals([], []).  
remUniqueVals([Q1|RestQ],[Q1|Xs]) :-        
   member(Q1,RestQ),  
   remUniqueVals(RestQ,Xs).  
remUniqueVals([Q1|RestQ],Xs) :-  
   remove(Q1,[Q1|RestQ], NewQ),  
   remUniqueVals(NewQ,Xs).  
Run Code Online (Sandbox Code Playgroud)

我可以看到member(Q1,RestQ)它在第二次检查1,2,4时失败,因为它们现在不再在列表中,因此将它们删除.我想帮助解决这个问题,我的想法是检查member(Q1, PreviousQ),这是决赛中的元素Q.不知道如何实施,虽然任何帮助将不胜感激.

更新:

好的,谢谢你最终的结论:

remUniqueVals(_,[], []).  
remUniqueVals(_,[Q1|RestQ],[Q1|Xs]) :-        
   member(Q1,RestQ), 
   remUniqueVals(Q1,RestQ,Xs).  
remUniqueVals(PrevQ,[Q1|RestQ],[Q1|Xs]) :-        
   Q1 = PrevQ, 
   remUniqueVals(PrevQ,RestQ,Xs).  
remUniqueVals(PrevQ,[_|RestQ],Xs) :-  
   remUniqueVals(PrevQ,RestQ,Xs). 

remUniqueVals(0,[4,1,1,3,2,2,5,5],Q).
Q = [1, 1, 2, 2, 5, 5].

remUniqueVals(0, [A,B,C], [1,1]).
A = 1,
B = 1,
C = 1.
Run Code Online (Sandbox Code Playgroud)

list prolog

5
推荐指数
3
解决办法
2549
查看次数