GAP:IsPronormal

Function type
The function takes two arguments, both of which are groups, and outputs a boolean variable (true/false).

Behavior
The behavior is as follows:


 * 1) The function returns true if the two groups are subgroups of a common big group, and the conjugate of any element in the second subgroup by any element in the first subgroup is also conjugate to it in the subgroup generated. In other words, if the first subgroup is $$G$$ and the second subgroup is $$H$$, the function returns true if for any $$g \in G$$, the subgroups $$H$$ and $$H^g$$ are conjugate in the join $$\langle H, H^g \rangle$$.
 * 2) The function returns false if the two groups are subgroups of a common big group, and the above condition is violated. In other words, if the first group is $$G$$ and the second group is $$H$$, the function returns false if there exists $$g \in G$$ such that $$H$$ and $$H^g$$ are not conjugate in $$\langle H, H^g \rangle$$.
 * 3) If either of the arguments is not a group, or if the two arguments are groups that are not contained in a common big group, GAP returns a NoMethodFound error.

Typical usage
The typical uasge of the function is as follows:

IsPronormal(group,subgroup);

The function returns true if the subgroup is a pronormal subgroup of the whole group and false otherwise.

Code
Here is an algorithmic version:

IsPronormal := function(G,H) local K,g; for g in Set(G) do	   	K := Group(Union(H,H^g)); if not (IsConjugate(K,H,H^g)) then return false; fi; od; return true; end;;

Here is a version written in a functional programming style:

IsPronormal := function(G,H) return(ForAll(Set(G),g->IsConjugate(Group(Union(H,H^g)),H,H^g))); end;;

Underlying idea
The code works as follows:


 * The code cycles over all $$g$$ in the underlying set of $$G$$.
 * For every such $$g$$, the code considers the groups $$H$$ and $$H^g$$, and determines whether they are conjugate in the subgroup they generate.